【问题标题】:lexer skips a token词法分析器跳过一个标记
【发布时间】:2013-07-02 05:02:11
【问题描述】:

我正在尝试进行基本的基于 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 规则时,它不会“回溯”到 ,因为词法分析器就是这样工作的。

我该如何解决?

【问题讨论】:

    标签: antlr3 lexer


    【解决方案1】:

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

    • 看起来您的 HOST 规则可能更适合作为解析器规则 host
    • 您需要确保并提供可以匹配 . 的词法分析器规则(一起或作为两个单独的标记)。

    【讨论】:

    • 好的,我试试antlr4。
    • 我无法让 antlr4 生成 C#。根据github.com/sharwell/antlr4cs修改项目后,在构建过程中得到Error 16 Unknown build error: Error: Could not find or load main class Studio。如果我尝试从命令行手动运行 antlr4-csharp-4.0.1-SNAPSHOT-complete.jar,它会生成 java 类。
    • 好的,我能够通过使用与 msbuild 任务完全相同的参数从命令行生成 C#。仍然不知道为什么它在构建时不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多