Antlr4 语法分析器中令牌的隐式定义警告,当在lexer中定义时

Antlr4 语法分析器中令牌的隐式定义警告,当在lexer中定义时,antlr4,Antlr4,我在尝试使用版本ANTLR 4.7.2构建解析器时收到此警告 warning(125): CobolParser.g4:1075:20: implicit definition of token END_ACCEPT in parser 如果我将accept_语句规则更改为使用END_ADD而不是END_accept, 解析器生成时没有警告 你能解释一下为什么我会收到这个警告吗, 既然END_ACCEPT是在lexer中定义的 从CobolLexer.g4: END:

我在尝试使用版本ANTLR 4.7.2构建解析器时收到此警告

warning(125): CobolParser.g4:1075:20: implicit definition of token END_ACCEPT in parser
如果我将accept_语句规则更改为使用END_ADD而不是END_accept, 解析器生成时没有警告

你能解释一下为什么我会收到这个警告吗, 既然END_ACCEPT是在lexer中定义的

从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?;

我无法复制这一点:

#/副秘书长/垃圾箱/环境卫生
ANTLR_JAR=“ANTLR-4.8-complete.JAR”
ANTLR_URL=”https://www.antlr.org/download/$ANTLR_JAR“
#下载ANTLR JAR(如果不存在)
如果[!-f“$ANTLR_JAR”];然后
wget“$ANTLR_URL”
fi
#创建lexer语法
echo“lexer-grammarcobollexer;
接受:[Aa][Cc][Cc][Ee][Pp][Tt];
加:[Aa][Dd][Dd];
致:[Tt][Oo];
完:[Ee][Nn][Dd];;
给予:[Gg][Ii][Vv][Ii][Nn][Gg];
结束接受:结束“-”[Aa][Cc][Cc][Ee][Pp][Tt];
完(续):完"-"[Aa][Dd][Dd];;
任何:.;“>CobolLexer.g4
#创建解析器gramar
echo语法分析器CobolParser;
选项{tokenVocab=CobolLexer;}
accept_语句:accept_目标
从句?
论例外条款*
接受吗?;
简单添加:从中添加+
(要将_添加到+?
(给予加上给予+?
关于\u size\u error\u子句*
完(续)?;
接受目标:任何;
从条款:任何;
关于例外条款:任何;
添加来自:任何;
添加到:任何;
加上:任何;
on_size_error_子句:ANY;“>CobolParser.g4
#生成lexer和parser类
java-cp“$ANTLR_JAR”org.ANTLR.v4.Tool*.g4
回声“完成!”

当我运行上面的脚本时,我的控制台不会显示任何警告。

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

你的评论:也许是一些旧的lexer定义文件把事情搞砸了? 让我进一步调查

以下是工作目录内容(请注意旧的CobolLexer.tokens文件):

我发现将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

这很奇怪。也许是一些旧的lexer定义文件把事情搞砸了?尝试删除所有生成的文件并重新生成lexer和解析器。否则,请尝试使用最新版本,即
4.8-1
。每次重建解析器之前,我都会运行此清理脚本:del.\parser\Cobol*.java del.\parser\Cobol*.class del.\parser\Cobol*.tokens del.\parser*.class,我将尝试最新版本的ANTLR。将我的ANTLR版本从4.7.2更新为最新版本4.8,但我仍然得到相同的结果(隐式定义警告)。无法复制它,请检查我的答案。您需要编辑您的问题,并包含足够的代码/语法,以便其他人可以复制它。
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
>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
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