我在使用JISON时遇到了一些麻烦。我试图匹配由点分割的方括号中的2个字符串。我遇到的问题是,如果任何字符串以数字或减号开头,它会将其检测为MINUS或NUMBER [这是正确的],但我想首先检查STRING正则表达式是否与用户输入的字符串匹配,之后检查NUMBER或MINUS。
%lex
%%
'-' return 'MINUS'
[0-9]+ return 'NUMBER'
[_-]+ return 'SYMBOL'
[a-zA-Z0-9_-\s]+ return 'STRING'
'.' return 'DOT'
'[' return '['
']' return ']'
<<EOF>> return 'EOF'
/lex
%start program
%%
program
: e EOF
{console.log(JSON.stringify($1, null, 4)); return $1; }
;
e
: NUMBER
{ $$ = {node: 'NUMBER', value: parseInt(yytext)}; }
| STRING
{ $$ = {node: 'STRING', value: yytext}; }
| SYMBOL
{ $$ = {node: 'SYMBOL', value: yytext}; }
| '[' STRING DOT STRING ']'
{ $$ = {node: 'SQUARE_BRACKETS', left: $2, right: $4}; }
;
它应该匹配[2-20-March.Gum](例如)。
谢谢!
答案 0 :(得分:0)
STRING
将匹配任何MINUS
,NUMBER
或SYMBOL
,因此,如果您坚持首先匹配STRING
,那么这些都不会匹配你也可以从文件中删除它们。 Jison只是按顺序匹配模式,直到找到匹配的模式。
也许你的目的是以不同的方式匹配括号内表达的内容;如果是这样,您将需要一个不同的标记策略(并且您需要更清楚您的要求可能是什么)。
说实话,我不明白
[_-]+ return SYMBOL;
你真的打算SYMBOL
只匹配包含短划线和下划线的序列吗? (-_____-_____-
)