antlr4 соответствие выражения выбора

Я пишу Chrome DEPS файл парсер. Как сопоставить одно из следующих определений правила грамматики righttexpr. Моя грамматика похожа на следующую:

grammar Depsgrammar;

prog:   expr+ EOF;

expr:   varline
   ;

varline:  
   ID EQ  rightexpr  
    ;

rightexpr :  
    basicvalue | bentukonejsonval| bentuktwojsonval  
   ;

bentukonejsonval :
   '[' string?  (COMMA string )* COMMA? ']'
    ;

bentuktwojsonval :
    '{' singledictexpr?  (COMMA singledictexpr )* COMMA? '}'
   ;

singledictexpr :
    string ':' basicvalue
   ;

basicvalue :
 True
| False
| string
| NUM
| varfunc
;


varfunc :
 Var '(' string ')'
 ;

string :
 SIMPLESTRINGEXPRDOUBLEQUOTE
| SIMPLESTRINGEXPRSINGLEQUOTE
;

Var : 'Var' ;
COMMA : ',' ;
NUM : [0-9]+;
ID : [a-zA-Z0-9_]+;
True : [tT] [Rr] [Uu] [Ee];
False: [Ff] [Aa] [Ll] [Ss] [Ee];

fragment SIMPLESTRINGEXPRDOUBLEQUOTEBASE :   ~ ( '\n' | '\r' | '"' )*  ;
SIMPLESTRINGEXPRDOUBLEQUOTE: '"' SIMPLESTRINGEXPRDOUBLEQUOTEBASE '"' ;
fragment SIMPLESTRINGEXPRSINGLEQUOTEBASE :   ~ ( '\n' | '\r' | '\'' )* ;
SIMPLESTRINGEXPRSINGLEQUOTE : '\'' SIMPLESTRINGEXPRSINGLEQUOTEBASE '\'' ;
EQ : '=';
COMMENT:
  '#' ~ ( '\n' | '\r' )* '\n' -> skip ;

WS : [ \n\t\r]+ -> skip ;

Я хочу, чтобы пользователь мог ввести этот ввод

#adas21 #FS;SFD33
_as= Var('das') # somelongth comment
_as_0= FALSE # somelongth comment
_as_0= 'as!' # somelongth comment
gclient_gn_args = [

#ad as!~;
'checkout_libaom',
'checkout_nacl',
'"{cros_board}" == "amd64-generic"',
'checkout_oculus_sdk',
 ]


 vars = {
 'checkout_libaom':1,
 'checkout_nacl': "SS",
 'checkout_oculus_sdk': FalSe,
 'checkout_oculus_sdk':'',
  }

 s=[
 ]

всякий раз, когда я ввожу простой синтаксис в grun

sa=true

всегда указывайте в строке 1:3 несоответствующий ввод 'true', ожидая бла..(deftexpr def). Мне не хватает понимания базового решения о выборе соответствия для antlr4. Не могли бы вы научить меня? Спасибо

1 ответ

Решение

Всякий раз, когда у вас возникает ошибка, когда список ожидаемых токенов, по-видимому, содержит неожиданный токен, рекомендуется составить список сгенерированных токенов. Вы можете сделать это, передав -tokens возможность grun, Если вы сделаете это для вашего вклада, вы увидите, что true интерпретируется как ID токен, а не True маркер.

Причина этого заключается в том, что когда несколько правил лексера будут совпадать с текущим вводом и приводят к совпадению одинакового размера, выбирается то, которое определено ранее в грамматике. Потому, что ID определяется раньше True, это имеет приоритет. Как правило, все ключевые слова должны быть определены до ID Правило, чтобы предотвратить именно эту проблему.

Другими словами, перемещение True а также False правила до ID решит вашу проблему.

Другие вопросы по тегам