Parsing 选择表达式的antlr4匹配

Parsing 选择表达式的antlr4匹配,parsing,antlr4,grun,Parsing,Antlr4,Grun,我在写chrome解析器。如何匹配rightexpr的以下语法规则定义之一。我的语法是 以下一项: grammar Depsgrammar; prog: expr+ EOF; expr: varline ; varline: ID EQ rightexpr ; rightexpr : basicvalue | bentukonejsonval| bentuktwojsonval ; bentukonejsonval

我在写chrome解析器。如何匹配rightexpr的以下语法规则定义之一。我的语法是 以下一项:

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”,期望无意义..(rightexpr def)。我对基本的antlr4选择匹配决策缺乏理解。你能教我吗?
谢谢

每当出现错误时,如果预期令牌列表似乎包含意外令牌,最好列出生成的令牌。您可以通过将
-tokens
选项传递到
grun
来实现这一点。如果对输入执行此操作,您将看到
true
被解释为
ID
标记,而不是
true
标记

原因是当多个lexer规则匹配当前输入并产生相同大小的匹配时,就会选择语法中前面定义的规则。因此,因为
ID
是在
True
之前定义的,所以它优先。通常,所有关键字都应在
ID
规则之前定义,以准确防止此问题


换句话说,在
ID
之前移动
True
False
规则将解决您的问题。

谢谢,我真是太蠢了。。在lexer的声明顺序上做一点小小的改变是非常有影响的。。莱森今天学到了什么