重写(X+;)?在ANTLR语法中为X*

重写(X+;)?在ANTLR语法中为X*,antlr,antlr4,grammar,Antlr,Antlr4,Grammar,在 我发现了很多(X+)?的实例 这些不应该用X*替换吗 以下是我用自己的分析工具找到的一组实例: sql/plsql/PlSqlParser.g4(1654,11): Warning: rewrite as `X*`, token `?` at offset 39760 sql/plsql/PlSqlParser.g4(1754,27): Warning: rewrite as `X*`, token `?` at offset 42796 sql/plsql/PlSqlParser.g4(1

我发现了很多
(X+)?
的实例

这些不应该用
X*
替换吗

以下是我用自己的分析工具找到的一组实例:

sql/plsql/PlSqlParser.g4(1654,11): Warning: rewrite as `X*`, token `?` at offset 39760
sql/plsql/PlSqlParser.g4(1754,27): Warning: rewrite as `X*`, token `?` at offset 42796
sql/plsql/PlSqlParser.g4(1786,31): Warning: rewrite as `X*`, token `?` at offset 43928
sql/plsql/PlSqlParser.g4(1815,31): Warning: rewrite as `X*`, token `?` at offset 44865
sql/plsql/PlSqlParser.g4(2233,74): Warning: rewrite as `X*`, token `?` at offset 56180
sql/plsql/PlSqlParser.g4(2245,12): Warning: rewrite as `X*`, token `?` at offset 56458
sql/plsql/PlSqlParser.g4(2490,82): Warning: rewrite as `X*`, token `?` at offset 62412
sql/plsql/PlSqlParser.g4(2577,137): Warning: rewrite as `X*`, token `?` at offset 64544
sql/mysql/Positive-Technologies/MySqlLexer.g4(1176,50): Warning: rewrite as `X*`, token `?` at offset 53848
sql/mysql/Positive-Technologies/MySqlLexer.g4(1178,52): Warning: rewrite as `X*`, token `?` at offset 53988
sql/mysql/Positive-Technologies/MySqlLexer.g4(1176,50): Warning: rewrite as `X*`, token `?` at offset 53848
sql/mysql/Positive-Technologies/MySqlLexer.g4(1178,52): Warning: rewrite as `X*`, token `?` at offset 53988
sql/tsql/TSqlParser.g4(2410,13): Warning: rewrite as `X*`, token `?` at offset 84325
sql/tsql/TSqlParser.g4(2459,13): Warning: rewrite as `X*`, token `?` at offset 86539
informix/informix.g4(2879,25): Warning: rewrite as `X*`, token `?` at offset 35322
antlr/antlr2/examples/python.g2(660,48): Warning: rewrite as `X*`, token `?` at offset 13664
antlr/antlr2/examples/java.g2(905,4): Warning: rewrite as `X*`, token `?` at offset 25794
cql3/CqlLexer.g4(996,19): Warning: rewrite as `X*`, token `?` at offset 8042
cql3/CqlLexer.g4(996,88): Warning: rewrite as `X*`, token `?` at offset 8111
cql3/CqlLexer.g4(996,19): Warning: rewrite as `X*`, token `?` at offset 8042
cql3/CqlLexer.g4(996,88): Warning: rewrite as `X*`, token `?` at offset 8111
restructuredtext/ReStructuredText.g4(100,49): Warning: rewrite as `X*`, token `?` at offset 2632
fortran77/Fortran77Parser.g4(433,61): Warning: rewrite as `X*`, token `?` at offset 7722
fortran77/Fortran77Parser.g4(437,47): Warning: rewrite as `X*`, token `?` at offset 7790
fortran77/Fortran77Parser.g4(441,48): Warning: rewrite as `X*`, token `?` at offset 7861
verilog/verilog/Verilog2001.g4(366,68): Warning: rewrite as `X*`, token `?` at offset 10098
verilog/verilog/Verilog2001.g4(370,33): Warning: rewrite as `X*`, token `?` at offset 10164
verilog/verilog/Verilog2001.g4(370,67): Warning: rewrite as `X*`, token `?` at offset 10198
prov-n/PROV_N.g4(28,63): Warning: rewrite as `X*`, token `?` at offset 1253
cobol85/Cobol85.g4(174,47): Warning: rewrite as `X*`, token `?` at offset 4773
vb6/VisualBasic6Parser.g4(110,41): Warning: rewrite as `X*`, token `?` at offset 2788

是的,我认为你是对的
(x+)
相当于
x*
。查看生成的代码和ATN,虽然它们看起来可能不同,但可以将其中一个生成的代码重构为另一个,所有对ErrorHandler.Sync()和TokenStream.LA()的调用都匹配,但是Kleene star版本清理器的代码和ATN是相同的。Antlrvsix.Trash符号中至少有一个模式是
“//ebnf[blockSuffix/ebnfSuffix/QUESTION and block/altList[@ChildCount=1]/alternative[@ChildCount=1]/element/ebnf/blockSuffix/ebnfSuffix/PLUS]”
,但看起来还有其他模式。很好。如果可以的话,请用这些更改向语法库发出请求。