gpt4 book ai didi

java - ANTLR NoViableAltException 与 JAVA

转载 作者:搜寻专家 更新时间:2023-11-01 03:28:13 25 4
gpt4 key购买 nike

在我使用 antlrworks 的语法中,我可以获得像 if 这样的规则的 noviablealtexception,而它需要相应的右括号和左括号。但是,在 Java 中,我无法获得 noviablealtexception。

loop_statement: (WHILE LPAREN expr RPAREN statement)
| (DO statement WHILE LPAREN expr RPAREN);

condition_statement
: IF LPAREN expr RPAREN statement (options {greedy=true;}: ELSE statement)?

在语句规则中,我有一个 block 规则,它是,

statement_blocks
: (LBRACE statement* RBRACE)
;

声明规则如下,

statement
: var_dec
| statement_blocks
| condition_statement
| loop_statement
| expr_statement
;

在发布这篇文章之前,我检查了一些示例。我想我需要在每条规则的末尾添加 EOF。当我为这些规则添加 EOF 时,我得到了不同的错误。例如,

loop_statement: ((WHILE LPAREN expr RPAREN statement)
| (DO statement WHILE LPAREN expr RPAREN)) EOF;

condition_statement
: (
(IF LPAREN expr RPAREN statement (options {greedy=true;}: ELSE statement)?
)EOF

这些是我从以下输入中得到的;

if(s==d){
d=s;
if(a=n){
s=h;
}
a=g;
}

第 6:0 行在“a”处缺少 EOF
当我从第一个“if”中删除第一个左括号时

if(s==d)
d=s;
if(a=n){
s=h;
}
a=g;
}

testcases/new file line 3:0 missing EOF at 'if',
测试用例/新文件第 6:0 行在“a”处缺少 EOF

 while(s==d){
d=s;
while(a=n){
s=h;
}
a=g;
}

第 6:0 行在“a”处缺少 EOF
当我从第一个“while”中删除第一个左括号时

 while(s==d)
d=s;
while(a=n){
s=h;
}
a=g;
}

测试用例/新文件第 3:0 行在“while”处缺少 EOF
测试用例/新文件第 6:0 行在“a”处缺少 EOF

最佳答案

不,您需要将 EOF 放在“主要”解析器规则的末尾,而不是在多个语句之后。通过这样做,解析器期望在这些语句之后文件结束(当然这是不正确的)。

我的猜测是您的入口点不包含 EOF 导致解析器在遇到无效输入时过早停止而不是抛出错误/异常。

这是一个演示(注意 parse 规则之后的 EOF):

T.g

grammar T;

parse
: statement+ EOF
;

statement
: var_dec
| statement_blocks
| c=condition_statement {System.out.println("parsed :: " + $c.text);}
;

var_dec
: ID '=' ID ';'
;

statement_blocks
: LBRACE statement* RBRACE
;

condition_statement
: IF LPAREN expr RPAREN statement (options {greedy=true;}: ELSE statement)?
;

expr
: ID '==' ID
;

IF : 'if';
ELSE : 'else';
ID : 'a'..'z'+;
LBRACE : '{';
RBRACE : '}';
LPAREN : '(';
RPAREN : ')';
SPACE : (' ' | '\t' | '\r' | '\n')+ {skip();};

可以用类进行测试:

主程序.java

import org.antlr.runtime.*;

public class Main {
public static void main(String[] args) throws Exception {
TLexer lexer = new TLexer(new ANTLRFileStream("in.txt"));
TParser parser = new TParser(new CommonTokenStream(lexer));
parser.parse();
}
}

全部测试

如果您现在解析输入文件 (in.txt):

if(s==d) {
d=s;
if(a==n){
s=h;
}
a=g;
}

没问题,如你所见:

java -cp antlr-3.3.jar org.antlr.Tool T.g
javac -cp antlr-3.3.jar *.java
java -cp .:antlr-3.3.jar Main

parsed :: if(a==n){s=h;}
parsed :: if(s==d){d=s;if(a==n){s=h;}a=g;}

如果您从文件 in.txt 中删除 (),您将收到以下(类似的)错误:

in.txt line 1:8 missing RPAREN at '{'

关于java - ANTLR NoViableAltException 与 JAVA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7702048/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com