标签: antlr

为什么antlr3 c#解析器方法是私有的?

我正在构建一个antlr中的解析器,它可以编译成一个可用的java目标.当我重新定位c#2时,它产生一个解析器,其中所有的解析方法都是私有的,但标有[GrammarRule("rulename")]属性.

实际调用解析器的批准方法是什么?

我正在使用ANTLR 3.3 2010年11月30日12:45:30

谢谢,安迪

c# antlr antlr3

14
推荐指数
1
解决办法
1395
查看次数

ANTLR不会在无效输入上抛出错误

我正在使用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抛出异常而不是处理它并恢复.该部分还有一些关于覆盖不匹配和恢复功能的内容,以确保抛出所有可能的异常.

java antlr exception antlrworks

14
推荐指数
1
解决办法
7225
查看次数

解析SQL语法,设计模式

我正在尝试使用模拟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的语法 AST为上述声明 现在我面临两个问题

  1. 如何为where子句实现访问者?ABX = 45表示所有对象的字段X都为45,如何进行过滤是否有任何好方法可以做到这一点?
  2. 有没有办法遍历生成的AST而不会使用自定义逻辑(存储访问,属性getter/setter等)使访问者代码混乱.

第二个问题更令人担忧,因为声明可能会做很多事情.

简而言之,任何建议/链接/设计模式,以很好地解析sql选择语句的一小部分将不胜感激

谢谢

java sql design-patterns antlr abstract-syntax-tree

14
推荐指数
1
解决办法
1万
查看次数

ANTLR 4树注入/重写操作符

在ANTLR 3中,您可以执行以下操作:

    andExpression
  :  (andnotExpression        -> andnotExpression)
     (AND? a=andnotExpression -> ^(AndNode $andExpression $a))* 
  ;
Run Code Online (Sandbox Code Playgroud)

知道如何在新版本中做到这一点吗?

antlr antlr3 antlr4

14
推荐指数
2
解决办法
6644
查看次数

ANTLR 4:避免错误打印到控制台

使用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中禁用打印到控制台?

antlr antlr4

14
推荐指数
2
解决办法
3500
查看次数

使用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)

java parsing antlr antlr3 antlr4

13
推荐指数
1
解决办法
8760
查看次数

扩展简单的ANTLR语法以支持输入变量

我仍然在寻求一种非常简单的语言,现在我知道没有.所以我自己用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)

java antlr antlr3

12
推荐指数
2
解决办法
8553
查看次数

ANTLR ClassCastException

为什么在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)

有任何想法吗?

java antlr

12
推荐指数
1
解决办法
3723
查看次数

Scala的ANTLR语法?

我正在尝试为演示项目构建静态分析工具.我们可以自由选择要分析的语言.我从使用ANTLR编写Java代码分析器开始.我现在想对Scala代码做同样的事情.但是,我找不到Scala的ANTLR语法.它存在吗?Scala语法还有其他机器可读的形式吗?

parsing antlr scala

12
推荐指数
2
解决办法
2930
查看次数

ANTLR4中的语义谓词?

你如何将ANTLR 3中编写的这部分代码翻译成ANTLR 4?

expr: (Identifier '.')=> (refIdentifier)
  | (Identifier '!')=> (refIdentifier)
  | (Identifier '=>')=> (lambdaExpression);
Run Code Online (Sandbox Code Playgroud)

我的意思是这种语义谓词现在似乎不存在.我可以用什么呢?

antlr antlr4

12
推荐指数
1
解决办法
6409
查看次数