JISON令牌使用相同的字符

时间:2017-11-07 15:45:41

标签: javascript token bison jison

我在使用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](例如)。

谢谢!

1 个答案:

答案 0 :(得分:0)

STRING将匹配任何MINUSNUMBERSYMBOL,因此,如果您坚持首先匹配STRING,那么这些都不会匹配你也可以从文件中删除它们。 Jison只是按顺序匹配模式,直到找到匹配的模式。

也许你的目的是以不同的方式匹配括号内表达的内容;如果是这样,您将需要一个不同的标记策略(并且您需要更清楚您的要求可能是什么)。

说实话,我不明白

 [_-]+                return SYMBOL;

你真的打算SYMBOL只匹配包含短划线和下划线的序列吗? (-_____-_____-