0

我正在尝试进行基本的基于 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,因此词法分析器将选择使用它。然后,当它无法将输入匹配到 HOST 规则时,它不会“回溯”到 ,因为这就是词法分析器的工作方式。

我如何绕过它?

4

1 回答 1

1

作为前言,ANTLR 4 在这里不会以奇怪的方式表现。ANTLR 3 和 ANTLR 4都应该匹配ALPHANUM,然后给出 2 个语法错误,然后匹配另一个ALPHANUM,我可以自信地说 ANTLR 4以这种方式运行。

  • 看起来您的HOST规则可能更适合成为host解析器规则。
  • 您需要确保并提供可以匹配的词法分析器规则.(一起或作为两个单独的标记)。
于 2013-07-02T11:17:04.323 回答