2009-05-18 31 views
0

我试图解析的Name=Value对,其中的值可以包含除空白任何东西(即值可以包含等号)的列表。
名称仅限于通常的标识符字符。ANTLR相当于野牛拒绝行动?

的问题是,“价值”令牌匹配的一切。例如,对于输入:

dude=sweet 

解析器将所述整个输入与“值”令牌(和抛出MismatchedTokenException)相匹配。

bison,是否有可能为令牌分配状态(或者仅仅是为非终止?),以便它们只有在明确过渡到该状态后才成为“符合条件”匹配。

编辑关于它的思考,这不会在工作野牛要么 - 令牌分裂已经发生(在柔性);但是,我认为有一种方式来REJECT令牌,迫使柔性尝试了第二最佳匹配。

这里是我的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' 
    ; 

回答

1

你有CONTINUOUS_VALUE和标识(在标识字符是CONTINUOUS_VALUE的一个子集,有可能是一对夫妇的方式来解决这个问题。一种方法是用启动CONTINUOUS_VALUE之间有一些重叠的“=”然后剥离出来的文字在CSHARP它是这样的:。

CONTINUOUS_VALUE 
    : '=' ~(ALL_WS)+ { Text = Text.Substring(1, Text.Length - 1); } 
    ; 

然后只取“=”走出commandParam规则

第二届办法是使标识符和CONTINUOUS_VALUE解析器规则(小写至少是冷杉t字母),那么你有上下文来找出哪一个应该匹配。你也许能够使它们成为碎片,并在commandParam中引用它们,但是我不确定是否可以嵌套碎片,因为你已经有了ALL_WS碎片。

另外,不要你需要某种形式的NameValue对之间的分隔符的?

+0

空格是分隔符 - 这就是为什么它不是在价值观的身体允许的。用'='字符开始这个值听起来像是个好主意。我会尝试的。 – 2009-09-04 12:01:38