使用Jison/Bison解析字符串



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

我有一些像这样的代码:

a: "{{index()}}"
b: "{{blah(2, 'aba')}}"

我试图创建一个解析器,如果传递字符串a,则返回index(),如果传递字符串b,则返回blah(2, 'aba')。(本质上,我需要解析包含方法调用的字符串)。

我一直在尝试从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;}
    ;

显然它还没有完成;它不识别括号。我从向解析器传递这个字符串的简单示例开始:{{index}}。当我给当前解析器这个时,它返回}}。基于我(绝对错误的)对语法的理解,我希望它返回index

我做错了什么?

您应该使用$n(其中n是一个数字)来获取表达式中的第n个令牌:

e
    : '{{' e '}}'
        {$$ = $2;}
    | STR
    ;

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

相关内容

  • 没有找到相关文章

最新更新