我正在学习如何使用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
,这就是你想要的