我正在构建一个antlr中的解析器,它可以编译成一个可用的java目标.当我重新定位c#2时,它产生一个解析器,其中所有的解析方法都是私有的,但标有[GrammarRule("rulename")]属性.
实际调用解析器的批准方法是什么?
我正在使用ANTLR 3.3 2010年11月30日12:45:30
谢谢,安迪
我正在使用ANTLR来解析我正在编写的Java工具中的逻辑表达式,并且我遇到了问题,因为将无效的输入字符串传递给生成的ANTLR词法分析器并且解析器不会导致任何异常.生成的文件不是像我期望的那样抛出RecognitionException,而是将错误消息打印到控制台并返回,好像没有发生错误,导致我的程序在以后遇到空数据时崩溃.
我使用ANTLRWorks版本1.4.3生成文件,似乎应该有某种选项让它实际抛出错误而不是打印到控制台,但我还没有找到任何东西.有谁知道如何让ANTLR实际抛出错误信息?我看到使用旧版本的ANTLR解决了C#中的同样问题,这是我需要做的吗?
编辑:在Bart指出我正在寻找的方向后,我找到了这个页面
https://theantlrguy.atlassian.net/wiki/display/ANTLR3/Migrating+from+ANTLR+2+to+ANTLR+3
其"错误处理"部分的代码完全符合我的要求.要更改ANTLR捕获异常的方式,可以在语法文件中说明:
@rulecatch {
catch (RecognitionException e) {
throw e;
}
}
Run Code Online (Sandbox Code Playgroud)
这迫使ANTLR抛出异常而不是处理它并恢复.该部分还有一些关于覆盖不匹配和恢复功能的内容,以确保抛出所有可能的异常.
我正在尝试使用模拟sql语法来构建一个简单的sql,类似于键值存储的接口.这些值基本上是POJO
一个例子是
select A.B.C from OBJ_POOL where A.B.X = 45 AND A.B.Y > '88' AND A.B.Z != 'abc';
Run Code Online (Sandbox Code Playgroud)
OBJ_POOL只是同一类POJO的列表.在这个例子中,A将是基类.
Class A
Class B
String C
Integer X
String Y
String Z
Run Code Online (Sandbox Code Playgroud)
现在ABC相当于A.getB().getC()
我使用Antlr解析上面的语句来获取AST,然后hoping使用Apache BeanUtils反射获取/设置字段名称.
我写了构建AST的语法
现在我面临两个问题
第二个问题更令人担忧,因为声明可能会做很多事情.
简而言之,任何建议/链接/设计模式,以很好地解析sql选择语句的一小部分将不胜感激
谢谢
在ANTLR 3中,您可以执行以下操作:
andExpression
: (andnotExpression -> andnotExpression)
(AND? a=andnotExpression -> ^(AndNode $andExpression $a))*
;
Run Code Online (Sandbox Code Playgroud)
知道如何在新版本中做到这一点吗?
使用ANTLR,我解析语法.ANTLR错误在语法的自定义编辑器中指示.但是,我想禁用将错误消息打印到Java控制台.
我已经实现了自己的BaseErrorListener并删除了ANTLR书中描述的默认值:
MyErrorListener errList=new MyErrorListener ();
lexer.removeErrorListeners();
lexer.addErrorListener(errList);
parser.removeErrorListeners();
parser.addErrorListener(errList);
Run Code Online (Sandbox Code Playgroud)
我仍然得到打印输出到我的Java控制台(连接到Java输出和错误流).
如何在ANTLR中禁用打印到控制台?
我正在尝试解析嵌套的布尔表达式并分别获取表达式中的各个条件.例如,如果输入字符串是:
(A = a OR B = b OR C = c AND((D = d AND E = e)OR(F = f AND G = g)))
我想以正确的顺序获得条件.即
D = d AND E = e OR F = f AND G = g AND A = a OR B = b OR C = c
我正在使用ANTLR 4来解析输入文本,这是我的语法:
grammar SimpleBoolean;
rule_set : nestedCondition* EOF;
AND : 'AND' ;
OR : 'OR' ;
NOT : 'NOT';
TRUE : 'TRUE' ;
FALSE : 'FALSE' ; …Run Code Online (Sandbox Code Playgroud) 我仍然在寻求一种非常简单的语言,现在我知道没有.所以我自己用ANTLR3写一个.
我在这个答案中找到了一个很好的例子:
Exp.g:
grammar Exp;
eval returns [double value]
: exp=additionExp {$value = $exp.value;}
;
additionExp returns [double value]
: m1=multiplyExp {$value = $m1.value;}
( '+' m2=multiplyExp {$value += $m2.value;}
| '-' m2=multiplyExp {$value -= $m2.value;}
)*
;
multiplyExp returns [double value]
: a1=atomExp {$value = $a1.value;}
( '*' a2=atomExp {$value *= $a2.value;}
| '/' a2=atomExp {$value /= $a2.value;}
)*
;
atomExp returns [double value]
: n=Number {$value = Double.parseDouble($n.text);}
| '(' exp=additionExp ')' {$value = …Run Code Online (Sandbox Code Playgroud) 为什么在ANTLR中生成代码时会出现此错误?
[16:06:38] error(10): internal error: C:\Users\user\Desktop\test.g : java.lang.ClassCastException: org.antlr.runtime.tree.CommonTree cannot be cast to org.antlr.tool.GrammarAST
org.antlr.grammar.v3.CodeGenTreeWalker.rules(CodeGenTreeWalker.java:1467)
org.antlr.grammar.v3.CodeGenTreeWalker.grammarSpec(CodeGenTreeWalker.java:1441)
org.antlr.grammar.v3.CodeGenTreeWalker.grammar_(CodeGenTreeWalker.java:509)
org.antlr.codegen.CodeGenerator.genRecognizer(CodeGenerator.java:421)
org.antlr.Tool.generateRecognizer(Tool.java:655)
org.antlr.Tool.process(Tool.java:468)
org.antlr.works.generate.CodeGenerate.generate(CodeGenerate.java:104)
org.antlr.works.generate.CodeGenerate.run(CodeGenerate.java:185)
java.lang.Thread.run(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
语法非常简单,仅用于测试:
grammar test;
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我正在尝试为演示项目构建静态分析工具.我们可以自由选择要分析的语言.我从使用ANTLR编写Java代码分析器开始.我现在想对Scala代码做同样的事情.但是,我找不到Scala的ANTLR语法.它存在吗?Scala语法还有其他机器可读的形式吗?
你如何将ANTLR 3中编写的这部分代码翻译成ANTLR 4?
expr: (Identifier '.')=> (refIdentifier)
| (Identifier '!')=> (refIdentifier)
| (Identifier '=>')=> (lambdaExpression);
Run Code Online (Sandbox Code Playgroud)
我的意思是这种语义谓词现在似乎不存在.我可以用什么呢?