如何使用ANTLR3 java目标解析以特定字母开头的单词

时间:2013-12-23 14:02:56

标签: antlr3

有没有办法解析以特定字符开头的单词?

我一直在尝试以下但是我无法获得任何有希望的结果:

//This one is working it accepts AD CD and such
example1
:
  .'D'
;
//This one is not, it expects character D, then any ws character then any character
example2
:
  'D'.
;
//These two are not working either
example3
:
  'D'.*
;
//Doesn't accept input due to error: "line 1:3 missing 'D' at '<EOF>'"
example4
:
  .*'D'
;


//just in case my WS rule:
/**    WhiteSpace Characters (HIDDEN)*/
WS  :   ( ' '
        | '\t'
        )+ {$channel=HIDDEN;}
    ;

我正在使用ANTLR 3.4

提前致谢

1 个答案:

答案 0 :(得分:1)

//This one is not, it expects character D, then any ws character then any character
example2
:
  'D'.
;

不,它不接受令牌(不是字符!)'D'后跟一个空格,然后是任何字符。由于example2是一个解析器规则,它不匹配字符,但匹配令牌(这有很大的不同!)。由于您将空格放在单独的通道上,因此空间也不符合此规则。最后,.(DOT)匹配任何令牌(再次:不是任何角色!)。

有关元字符(如.(DOT))的更多信息,其含义在词法分析器和解析器规则中有所不同:Negating inside lexer- and parser rules

//These two are not working either
example3
:
  'D'.*
;
//Doesn't accept input due to error: "line 1:3 missing 'D' at '<EOF>'"
example4
:
  .*'D'
;

除非你确切知道自己在做什么,否则不要使用.*:在你的情况下,它们会过多地吞噬(特别是当放在规则的开头或结尾时)。

看起来你正在尝试对解析器中的内容进行标记(所有example规则都是解析器规则)。据我所知,这些应该是词法规则。有关解析器规则和词法分析器规则之间差异的更多信息,请参阅:Practical difference between parser rules and lexer rules in ANTLR?