使用Jison / Bison解析一个字符串

时间:2014-06-09 23:58:14

标签: javascript bison jison

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

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

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

我正在尝试创建一个解析器,如果传递字符串index()将返回a,如果传递字符串blah(2, 'aba')则返回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;}
    ;

显然它尚未完成;它无法识别括号。我将从解析器传递此字符串的简单示例开始:{{index}}。当我给出当前解析器时,它返回}}。基于我对语法的(绝对错误的)理解,我希望它能够返回index

我做错了什么?

1 个答案:

答案 0 :(得分:4)

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

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

原始代码中唯一需要的更改是对$$ = $2;使用'{{' e '}}'操作。我没有对STR采取任何操作,因为默认操作是$$ = $1,这就是您想要的。