antlr4 - 在词法分析器中定义时,解析器警告中标记的隐式定义
问题描述
尝试使用版本 ANTLR 4.7.2 构建解析器时收到此警告
warning(125): CobolParser.g4:1075:20: implicit definition of token END_ACCEPT in parser
如果我将 accept_statement 规则更改为使用 END_ADD 而不是 END_ACCEPT,解析器将在没有警告的情况下构建。
您能否解释一下为什么我收到此警告,因为 END_ACCEPT 是在词法分析器中定义的?
来自 CobolLexer.g4:
END: [Ee][Nn][Dd] ;
END_ACCEPT: END '-' [Aa][Cc][Cc][Ee][Pp][Tt] ;
END_ADD: END '-' [Aa][Dd][Dd] ;
来自 CobolParser.g4:
options { tokenVocab=CobolLexer; }
accept_statement: ACCEPT accept_target
from_clause?
on_exception_clause*
END_ACCEPT?;
simple_add: ADD add_from+
(TO add_to+)?
(GIVING add_giving+)?
on_size_error_clause*
END_ADD?;
解决方案
这个问题原来是我的用户错误,如下所述。
您的评论:也许一些旧的词法分析器定义文件搞砸了? 让我进一步调查。
以下是工作目录内容(注意旧的 CobolLexer.tokens 文件):
02/03/2016 04:31 PM <DIR> parser
10/22/2020 09:14 AM 38,661 CobolLexer.g4
07/31/2019 09:31 AM 5,427 CobolLexer.tokens
10/22/2020 09:14 AM 87,542 CobolParser.g4
批处理文件 buildParser.bat 内容:
call cleanupParser
call java -jar %ANTLR_HOME% -o parser CobolLexer.g4
call java -jar %ANTLR_HOME% -o parser CobolParser.g4
javac -Xlint:deprecation -cp .;%ANTLR_HOME% parser\*.java
我发现将 CobolLexer.tokens 重命名为 CobolLexer.tokens.old 解决了这个问题,因此我检查了有助于避免这个问题的 ANTLR 选项。
ANTLR 选项信息:
>java -jar %ANTLR_HOME%
ANTLR Parser Generator Version 4.8
-o ___ specify output directory where all output is generated
-lib ___ specify location of grammars, tokens files
-atn generate rule augmented transition network diagrams
-encoding ___ specify grammar file encoding; e.g., euc-jp
-message-format ___ specify output style for messages in antlr, gnu, vs2005
-long-messages show exception details when available for errors and warnings
-listener generate parse tree listener (default)
-no-listener don't generate parse tree listener
-visitor generate parse tree visitor
-no-visitor don't generate parse tree visitor (default)
-package ___ specify a package/namespace for the generated code
-depend generate file dependencies
-D<option>=value set/override a grammar-level option
-Werror treat warnings as errors
-XdbgST launch StringTemplate visualizer on generated code
-XdbgSTWait wait for STViz to close before continuing
-Xforce-atn use the ATN simulator for all predictions
-Xlog dump lots of logging info to antlr-timestamp.log
-Xexact-output-dir all output goes into -o dir regardless of paths/package
-lib 选项正是我想要的,所以这里有一个新版本的 buildParser.bat 使用 -lib 选项解决了我遇到的问题:
call cleanupParser
call java -jar %ANTLR_HOME% -o parser CobolLexer.g4
call java -jar %ANTLR_HOME% -o parser -lib parser CobolParser.g4
javac -Xlint:deprecation -cp .;%ANTLR_HOME% parser\*.java
推荐阅读
- c++ - 我对编码很陌生,我面临一个问题
- sql - 连接到 SQL Server 中的不同列
- android - android:visibility 不使用可见或消失选项
- php - 在 PHP 中获取选中的复选框
- templates - 传递模板参数以提升多索引容器时出错
- javascript - Javascript 触发最后一个事件
- python-3.x - 在 Python Pandas 数据框中的字符串和整数列中的项目周围添加单引号
- ios - 将白标签应用程序的 fastlane 部署从本地计算机移至服务器/服务的最佳实践
- powershell - Powershell以字符串格式获取特定的MAC地址
- sql - SQL SERVER 中的清除表:删除时间