【问题标题】:ANTLR4: Unrecognized constant value in a lexer commandANTLR4:词法分析器命令中无法识别的常量值
【发布时间】:2015-02-07 15:59:01
【问题描述】:

我正在学习如何使用“更多”词法分析器命令。我输入了 ANTLR 书第 281 页中显示的词法分析器语法:

lexer grammar Lexer_To_Test_More_Command ;

LQUOTE : '"'        -> more, mode(STR) ;

WS   : [ \t\r\n]+   -> skip ; 

mode STR ;

STRING : '"'    -> mode(DEFAULT_MODE) ;

TEXT : .        -> more ;

然后我创建了这个简单的解析器来使用词法分析器:

grammar Parser_To_Test_More_Command ;

import Lexer_To_Test_More_Command ;

test: STRING EOF ;

然后我打开一个 DOS 窗口并输入以下命令:

antlr4 Parser_To_Test_More_Command.g4

生成此警告消息:

警告(155):Parser_To_Test_More_Command.g4:3:29:规则 LQUOTE 包含具有无法识别的常量值的词法分析器命令;词法分析器 解释器可能会产生不正确的输出

我在词法分析器或解析器中做错了吗?

【问题讨论】:

    标签: parsing antlr antlr4 lexer


    【解决方案1】:

    组合语法(仅以grammar 开头的语法,而不是parser grammarlexer grammar)不能使用词法分析器模式。而不是使用import 功能¹,您应该像这样使用tokenVocab 功能:

    Lexer_To_Test_More_Command.g4

    lexer grammar Lexer_To_Test_More_Command;
    
    // lexer rules and modes here
    

    Parser_To_Test_More_Command.g4

    parser grammar Parser_To_Test_More_Command;
    
    options {
      tokenVocab = Lexer_To_Test_More_Command;
    }
    
    // parser rules here
    

    ¹我实际上建议在 ANTLR 中完全避免使用 import 语句。我上面描述的方法几乎总是可取的。

    【讨论】:

    • 好的,我做了你建议 Sam 的更改。我仍然收到此错误: Parser_To_Test_More_CommandLexer.java:63: error: cannot find symbol case 0: _mode = STR;休息;符号:变量STR
    • @RogerCostello 文件 Parser_To_Test_More_CommandLexer.java 是您使用组合语法时遗留下来的。新的源文件名称略有不同(具体来说,它们不包括 LexerParser 后缀)。您需要清理并重建您的项目。
    • 再次感谢山姆。我清理并重建。这解决了符号问题,但导致了另一个问题。我从 DOS 提示符运行了这个命令:grun Parser_To_Test_More_Command test -gui 并产生了这个错误:线程“main”中的异常 java.lang.ClassCastException: class Parser_To_Test_More_Command at java.lang.Class.asSubclass(Unknown Source) at org.antlr .v4.runtime.misc.TestRig.process(TestRig.java:159) at org.antlr.v4.runtime.misc.TestRig.main(TestRig.java:143) 问题:grun 仅适用于组合语法吗?跨度>
    • 这正是我每次回到 antlr 时遇到的问题 - 恢复导入语句 -> 虚假警告,更改为 tokenVocab -> ClassCastException。似乎应该有更多关于正在发生的事情的记录。
    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-24
    相关资源
    最近更新 更多