0

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

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

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

我正在尝试创建一个解析器,index()如果传递了 string a,并且blah(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;}
    ;

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

我究竟做错了什么?

4

1 回答 1

6

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

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

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

于 2014-06-10T10:34:40.063 回答