选择表达式的antlr4匹配
antlr4 matching of choice expression
我正在编写 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 选择匹配决策的理解。你能教我吗?
谢谢
每当出现预期标记列表似乎包含意外标记的错误时,最好列出生成的标记。您可以通过将 -tokens
选项传递给 grun
来做到这一点。如果您对输入执行此操作,您会看到 true
被解释为 ID
标记,而不是 True
标记。
原因是当多个词法分析器规则匹配当前输入并产生相同大小的匹配时,会选择语法中较早定义的规则。所以因为 ID
在 True
之前定义,所以它优先。通常,所有关键字都应在 ID
规则之前定义,以防止出现此问题。
换句话说,将 True
和 False
规则移到 ID
之前将解决您的问题。
我正在编写 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 选择匹配决策的理解。你能教我吗? 谢谢
每当出现预期标记列表似乎包含意外标记的错误时,最好列出生成的标记。您可以通过将 -tokens
选项传递给 grun
来做到这一点。如果您对输入执行此操作,您会看到 true
被解释为 ID
标记,而不是 True
标记。
原因是当多个词法分析器规则匹配当前输入并产生相同大小的匹配时,会选择语法中较早定义的规则。所以因为 ID
在 True
之前定义,所以它优先。通常,所有关键字都应在 ID
规则之前定义,以防止出现此问题。
换句话说,将 True
和 False
规则移到 ID
之前将解决您的问题。