ANTLR - 包括意外字符的基本语法?

时间:2010-02-04 23:13:00

标签: c# antlr antlr3

我有一个非常简单的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) - 单独 - 但我需要它们作为单个令牌。

非常感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:0)

有几件事情,首先你的忽略解析器规则永远不会被触发,甚至不必出现在这个语法中(也没有超出根规则)。当然,既然你正在调试并且有了忽略规则,那么测试就更容易了(通过删除skip();在IGNORE词法分析器规则中)。

现在解释一下测试数据,因为没有一个词法分析器只匹配WORD'。'由于文本后面的句点,因此忽略了测试数据的结尾。如果在“工作”和句点之间放置一个空格,则会显示最后一个单词并且不显示句点,这就是您想要的。词法分析者不知道如何处理“工作”。什么时候结束如果你在最后添加另一个单词(在句点和新单词之间加一个空格),那么'工作'。正在从词法分析器规则作为一个IGNORE令牌传递。我原以为这个词会被传递,而句点只能在IGNORE令牌中。

答案 1 :(得分:0)

我决定用ANTLR3语法来解决你的问题。这就是我提出的,附带一些字符串:

  • 您的规范不包含很多规则,因此,我的语法不是很彻底。
  • 考虑添加到KEYW以匹配更多令牌。
  • 我现在没有C#兼容的ANTLR。将'skip()'大写以使其兼容。

    grammar TestSplitter;
    
    start: (KEYW DELIM!?)* ;
    KEYW: ('a'..'z'|'A'..'Z'|'.')+ ;
    DELIM: '.'? ' '+ ;