我正在编写Chrome DEPS file解析器。如何匹配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选择匹配决策缺乏了解。你能教我吗? 谢谢
答案 0 :(得分:1)
每当出现错误的预期令牌列表中似乎包含意外令牌时,最好列出生成的令牌。您可以通过将-tokens
选项传递给grun
来实现。如果您这样做是为了输入,您将看到true
被解释为ID
令牌,而不是True
令牌。
这样做的原因是,当多个词法分析器规则在当前输入上匹配并产生相同大小的匹配项时,将选择语法前面定义的规则。因此,由于ID
是在True
之前定义的,因此它具有优先权。通常,应在ID
规则之前定义所有关键字,以防止出现此问题。
换句话说,将True
和False
规则移到ID
之前将解决您的问题。