我有一个非常简单的ANTLR语法,我正在努力工作,但此刻失败了。真的很感激这方面的一些指示...
root : (keyword|ignore)*;
keyword : KEYWORD;
ignore : IGNORE;
KEYWORD : ABBRV|WORD;
fragment WORD : ALPHA+;
fragment ALPHA : 'a'..'z'|'A'..'Z';
fragment ABBRV : WORD?('.'WORD);
IGNORE : .{ Skip(); };
使用以下测试输入:
"some ASP.NET and .NET stuff. that work."
我想要的树只是一个关键字节点列表,
"some", "ASP.NET", "and", ".NET", "stuff", "that", "work"
目前我
"some", "ASP.NET", "and", ".NET", "stuff. that",
(由于某种原因“。”出现在最后一个关键字中,它错过了“工作”
如果我将ABBRV子句更改为
fragment ABBRV : ('.'WORD);
然后它工作正常,但我得到关键字(asp)和关键字(.net) - 单独 - 但我需要它们作为单个令牌。
非常感谢您提供的任何帮助。
答案 0 :(得分:0)
有几件事情,首先你的忽略解析器规则永远不会被触发,甚至不必出现在这个语法中(也没有超出根规则)。当然,既然你正在调试并且有了忽略规则,那么测试就更容易了(通过删除skip();在IGNORE词法分析器规则中)。
现在解释一下测试数据,因为没有一个词法分析器只匹配WORD'。'由于文本后面的句点,因此忽略了测试数据的结尾。如果在“工作”和句点之间放置一个空格,则会显示最后一个单词并且不显示句点,这就是您想要的。词法分析者不知道如何处理“工作”。什么时候结束如果你在最后添加另一个单词(在句点和新单词之间加一个空格),那么'工作'。正在从词法分析器规则作为一个IGNORE令牌传递。我原以为这个词会被传递,而句点只能在IGNORE令牌中。
答案 1 :(得分:0)
我决定用ANTLR3语法来解决你的问题。这就是我提出的,附带一些字符串:
我现在没有C#兼容的ANTLR。将'skip()'大写以使其兼容。
grammar TestSplitter;
start: (KEYW DELIM!?)* ;
KEYW: ('a'..'z'|'A'..'Z'|'.')+ ;
DELIM: '.'? ' '+ ;