lexer跳过一个令牌

时间:2013-07-02 05:02:12

标签: antlr3 lexer

我正在尝试进行基于ANTLR的基本扫描。我有一个词法分析器没有匹配想要的令牌的问题。

lexer grammar DefaultLexer;

ALPHANUM    :   (LETTER | DIGIT)+;
ACRONYM     :   LETTER '.' (LETTER '.')+;
HOST        :   ALPHANUM (('.' | '-') ALPHANUM)+;

fragment
LETTER  :   UNICODE_CLASS_LL | UNICODE_CLASS_LM | UNICODE_CLASS_LO | UNICODE_CLASS_LT | UNICODE_CLASS_LU;

fragment
DIGIT   :   UNICODE_CLASS_ND | UNICODE_CLASS_NL;

对于上面的语法,作为输入提供的hello. world字符串仅导致world。而我希望同时获得helloworld。我错过了什么?感谢。

增加:

好的,我了解到输入hello. world使用规则HOST比ALPHANUM匹配更多字符,因此lexer会选择使用它。然后,当它无法将输入与主机规则匹配时,它不会“回头”,因为这是词法分析器的工作方式。

我是如何绕过它的?

1 个答案:

答案 0 :(得分:1)

作为前言,ANTLR 4在这里不会表现得很奇怪。 ANTLR 3和ANTLR 4 匹配ALPHANUM,然后给出2个语法错误,然后匹配另一个ALPHANUM,我可以自信地说明ANTLR 4 表现得那样。

  • 您的HOST规则似乎更适合作为解析器规则的host
  • 您需要确保并提供可与.匹配的词法规则(一起或作为两个单独的令牌)。