Isa*_*ell 0 javascript bison jison
我正在尝试学习如何使用 Jison(使用 Bison 语法的 Javascript 解析器生成器)。
我有一些看起来像这样的代码:
a: "{{index()}}"
b: "{{blah(2, 'aba')}}"
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建一个解析器,index()如果通过 stringa和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;}
;
Run Code Online (Sandbox Code Playgroud)
显然它还没有完成;它不识别括号。我开始与经过解析器这个字符串的简单的例子:{{index}}。当我给我当前的解析器这个时,它返回}}. 根据我对语法的(绝对错误的)理解,我希望它返回index.
我究竟做错了什么?
您应该使用$n(where nis a number) 来获取表达式中的第 n 个标记:
e
: '{{' e '}}'
{$$ = $2;}
| STR
;
Run Code Online (Sandbox Code Playgroud)
从你的原代码,唯一需要改变就是使用行动$$ = $2;的'{{' e '}}'。我没有对其进行任何操作,STR因为默认操作是$$ = $1,这就是您想要的。
| 归档时间: |
|
| 查看次数: |
703 次 |
| 最近记录: |