- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在我使用 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
):
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();};
可以用类进行测试:
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/
我正在尝试通过编写语法来学习 ANTLR(我正在将 eclipse 与 ANTLR 的插件一起使用),在遇到错误之前一切正常: NoViableAltException: line 0:-1 no v
通过许多 HQL 查询,我一次又一次地收到此异常: Antlr.Runtime.NoViableAltException 这真的是通用且无用的 - 有谁知道如何最好地调试它?显然这是我的 HQL 的问
考虑以下我的语法摘录: definition : '(' 'define' ( '(' variable def_formals ')' body '
我有以下查询,当我直接在数据库中使用它时,该查询有效: @NamedQuery(name = "Sentitems.findWhereSendingDateTimeIsYesterdayByStatu
我在 Antlr 3 中定义了一个简单的语法,如下所示: grammar StringProcessor; options { output=AST; } @header { package com.
我在运行 jpa 时遇到问题。当我尝试运行 Login.java 时出现以下异常 WicketMessage: Can't instantiate page using constructor pub
我在配置单元中创建了下表。 CREATE TABLE IF NOT EXISTS employee ( eid int, name String, salary String,
在我使用 antlrworks 的语法中,我可以获得像 if 这样的规则的 noviablealtexception,而它需要相应的右括号和左括号。但是,在 Java 中,我无法获得 noviable
return NHibernateSession.CreateQuery(@"TRUNCATE TABLE dbo.Exceptions").ExecuteUpdate(); Exception of
我正在使用 antlr 3.2。我有一个简单的语法,它由原子(它们是字符“0”或“1”)组成,以及一个将它们的逗号分隔列表累积到列表中的规则。 当我传入“00”作为输入时,我没有收到错误消息,这让我感
我的 Json 在下面。我必须将此 JSON 加载到配置单元中,并且必须查询一些详细信息。 { "id": "1234", "pdid": "abcd", "summary": {
使用 NHibernate 3 linq 提供程序,我想选择一个项目子项的最大数量。 使用以下 linq 查询,我得到一个 Antlr.Runtime.NoViableAltException,后跟一
我在存储库方法上使用 @Query 指定 Spring Data 查询,但它抛出 NoViableAltException 异常。 这是我正在使用的存储库接口(interface)方法和注释: @Qu
考虑我们尝试将一些不正确的输入文本提供给某些语法(例如,包含一些未知标记的文本)。在 ANTLRWorks 中,在解释期间我们将在图表中看到 NoViableAltException。 UPD:出现这
我在查询名称中包含空格的表时遇到一些问题 如果我编写一个 sql 查询,它工作正常,即 SELECT * FROM [product groups],但是当使用 NHibernate CreateQu
UPD @Query(value = "select distinct d.documentId " + "from TrainingDocument d " +
我是一名优秀的程序员,十分优秀!