Токены JISON, использующие одинаковые символы
У меня есть некоторые проблемы с использованием JISON. Я пытаюсь сопоставить 2 строки в квадратных скобках, разделенных точкой. Проблема, с которой я сталкиваюсь, заключается в том, что если любая из строк начинается с цифры или минуса, она обнаруживает ее как MINUS или NUMBER [что правильно], но сначала я хочу проверить, соответствует ли регулярное выражение STRING строке, введенной пользователем, и после этого проверить номер или минус.
%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 ответ
STRING
будет соответствовать любому MINUS
, NUMBER
или же SYMBOL
так что если вы настаиваете на том, что STRING
в первую очередь, ни одно из них никогда не будет найдено, и вы можете просто удалить их из файла. Jison просто сопоставляет шаблоны по порядку, пока не найдет тот, который соответствует.
Возможно, вы намерены по-разному сопоставить содержимое выражений в скобках; если это так, вам понадобится другая стратегия токенизации (и вам нужно уточнить, какими могут быть ваши требования).
Если честно, я не понимаю
[_-]+ return SYMBOL;
Вы действительно намерены SYMBOL
сопоставлять только последовательности, содержащие тире и подчеркивания? (-_____-_____-
)