首页 > 解决方案 > 在词法分析器中定义时,解析器警告中标记的隐式定义

问题描述

尝试使用版本 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?;

标签: antlr4

解决方案


这个问题原来是我的用户错误,如下所述。

您的评论:也许一些旧的词法分析器定义文件搞砸了? 让我进一步调查。

以下是工作目录内容(注意旧的 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

推荐阅读