我正在尝试解析一个Name=Value
对列表,其中值可以包含除空格以外的任何内容(即值可以包含等号)。
该名称仅限于通常的标识符字符。
问题是,“价值”标记匹配一切。例如,对于输入:
dude=sweet
解析器会将整个输入与“值”标记匹配(并抛出一个MismatchedTokenException
)。
在bison中,有可能将状态分配给标记(或者这只是用于非终结符?),以便它们只有在显式转换到该状态后才变得“有资格”进行匹配。
编辑考虑一下,这在野牛中也不起作用-令牌拆分已经发生(在flex中);但是,我认为有一种方法可以REJECT
标记,迫使flex尝试次优匹配。
这是我的 ANTLR 语法。
grammar command_string;
start
: commandParam* EOF
;
commandParam
: IDENTIFIER '=' CONTINUOUS_VALUE
;
IDENTIFIER
: ('-'|'_'|'a'..'z'|'A'..'Z'|'0'..'9')+
;
CONTINUOUS_VALUE
: ~( ALL_WS )+
;
WS
: (ALL_WS) + { $channel = HIDDEN; }
;
fragment ALL_WS
: ' ' | '\t' | '\r' | '\n'
;