Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jQuery/JavaScript以正确的方式解析字符串_Javascript_Jquery_String_Parsing - Fatal编程技术网

jQuery/JavaScript以正确的方式解析字符串

jQuery/JavaScript以正确的方式解析字符串,javascript,jquery,string,parsing,Javascript,Jquery,String,Parsing,最近,我一直在尝试用jQuery和JavaScript模拟一种小型语言,但我遇到了我认为存在的问题。我想我可能把所有的东西都分析错了。 在守则中: @name Testing @inputs @outputs @persist @trigger print("Test") 当前我分离和解析字符串的方法是将所有代码拆分为行,然后使用搜索和拆分读取该行数组。例如,我会使用以下内容查找名称: if(typeof lines[line] === 'undefined') { } else {

最近,我一直在尝试用jQuery和JavaScript模拟一种小型语言,但我遇到了我认为存在的问题。我想我可能把所有的东西都分析错了。
在守则中:

@name Testing
@inputs
@outputs
@persist 
@trigger 
print("Test")
当前我分离和解析字符串的方法是将所有代码拆分为行,然后使用搜索和拆分读取该行数组。例如,我会使用以下内容查找名称:

if(typeof lines[line] === 'undefined')
{
}
else
{
    if(lines[line].search('@name') == 0)
    {
        name = lines[line].split(' ')[1];
    }
}
但我认为我在处理语法分析方面可能大错特错。
在阅读其他人如何处理像这样的代码块解析的示例时,人们似乎解析了整个代码块,而不是像我一样将其拆分为行。我想问题是,解析这样的东西的正确和常规方法是什么,您建议我如何使用它来解析这样的东西?

在类似这样的简单情况下,这是您选择的工具:

matches = code.match(/@name\s+(\w+)/)
name = matches[1]

要解析“真正”的编程语言,regexp的功能还不够强大,您需要一个解析器,可以是手工编写的,也可以是使用类似的工具自动生成的。

解析的一般方法,我经常采用以下方法:

  • 逐字符循环浏览完整的文本块
  • 如果您发现一个字符表示一个单元的开始,请调用专门的子函数来解析下一个字符
  • 在每个子函数中,如果找到某些字符,则调用其他子函数
  • 当找到一个字符时,从每个子函数返回,该字符表示单元已结束
  • 下面是一个小例子:

    var text = "@func(arg1,arg2)"
    
    function parse(text) {
        var i, max_i, ch, funcRes;
    
        for (i = 0, max_i = text.length; i < max_i; i++) {
            ch = text.charAt(i);
    
            if (ch === "@") {
                funcRes = parseFunction(text, i + 1);
                i = funcRes.index;
            }
        }
        console.log(funcRes);
    }
    
    function parseFunction(text, i) {
        var max_i, ch, name, argsRes;
    
        name = [];    
        for (max_i = text.length; i < max_i; i++) {
            ch = text.charAt(i);
    
            if (ch === "(") {
                argsRes = parseArguments(text, i + 1);
                return {
                    name: name.join(""),
                    args: argsRes.arr,
                    index: argsRes.index
                };
            } 
            name.push(ch);
        }
    }
    
    function parseArguments(text, i) {
        var max_i, ch, args, arg;
    
        arg = [];
        args = [];
        for (max_i = text.length; i < max_i; i++) {
            ch = text.charAt(i);
    
            if (ch === ",") {
                args.push(arg.join(""));
                arg = [];
                continue;
            } else if (ch === ")") {
                args.push(arg.join(""));
                return {
                    arr: args,
                    index: i
                };
            }
            arg.push(ch);
        }
    }
    
    var text=“@func(arg1,arg2)”
    函数解析(文本){
    var i,max_i,ch,funcRes;
    对于(i=0,max_i=text.length;i

    本例仅解析函数表达式,其语法为“@functionName(argumentName1,argumentName2,…”。一般的想法是只访问每个字符一次,而不需要保存当前状态,如“HassenAtCharacter”或“HassenOpeningBranchers”,这在解析大型结构时会变得非常混乱

    请注意,这是一个非常简单的示例,它忽略了所有的错误处理和类似的内容,但我希望可以看到总体思路。还要注意,我并不是说你应该一直使用这种方法。这是一种非常通用的方法,可用于许多场景。但这并不意味着它不能与正则表达式结合,例如,如果它在文本的某个部分比解析每个字符更有意义的话


    最后一句话:如果您将专门的解析函数放在主解析函数中,这样所有函数都可以访问相同的变量
    i

    ,您就可以省去麻烦了,谢谢您的帮助。我将更深入地研究regexp,看看是否可以开始着手进行正确的字符串解析。