我正在尝试学习如何使用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
。
我做错了什么?
答案 0 :(得分:4)
您应该使用$n
(其中n
是一个数字)来获取表达式中的第n个标记:
e
: '{{' e '}}'
{$$ = $2;}
| STR
;
原始代码中唯一需要的更改是对$$ = $2;
使用'{{' e '}}'
操作。我没有对STR
采取任何操作,因为默认操作是$$ = $1
,这就是您想要的。