使用 Jison/Bison 解析字符串

Isa*_*ell 0 javascript bison jison

我正在尝试学习如何使用 Jison(使用 Bison 语法的 Javascript 解析器生成器)。

我有一些看起来像这样的代码:

a: "{{index()}}"
b: "{{blah(2, 'aba')}}"
Run Code Online (Sandbox Code Playgroud)

我正在尝试创建一个解析器,index()如果通过 stringablah(2, 'aba')如果通过 string将返回b。(本质上,我需要解析包含方法调用的字符串)。

我一直在尝试适应 Jison 提供的示例,但由于我对解析的工作原理缺乏了解而受到阻碍!

这是我的语法文件:

/* lexical grammar */
%lex
%%

\s+                   /* skip whitespace */
[a-zA-Z0-9]+          return 'STR'
"{{"                  return '{{'
"}}"                  return '}}'
<<EOF>>               return 'EOF'
.                     return 'INVALID'

/lex

/* operator associations and precedence */
%token '{{' '}}'

%start expressions

%% /* language grammar */

expressions
    : e EOF
        { typeof console !== 'undefined' ? console.log($1) : print($1);
          return $1; }
    ;

e
    : '{{' e '}}'
        {$$ = yytext;}
    | STR
        {$$ = yytext;}
    ;
Run Code Online (Sandbox Code Playgroud)

显然它还没有完成;它不识别括号。我开始与经过解析器这个字符串的简单的例子:{{index}}。当我给我当前的解析器这个时,它返回}}. 根据我对语法的(绝对错误的)理解,我希望它返回index.

我究竟做错了什么?

Lou*_*uis 5

您应该使用$n(where nis a number) 来获取表达式中的第 n 个标记:

e
    : '{{' e '}}'
        {$$ = $2;}
    | STR
    ;
Run Code Online (Sandbox Code Playgroud)

从你的原代码,唯一需要改变就是使用行动$$ = $2;'{{' e '}}'。我没有对其进行任何操作,STR因为默认操作是$$ = $1,这就是您想要的。