Tag: antlr

将Antlr语法树转换为有用的对象

我正在思考如何最好地使用Antlr生成AST并将其转换为有用的对象,我可以在我的程序中使用它。 我的语法(除了学习)的目的是创建一个可执行(运行时解释)语言。 例如,如何获取属性子树并实例化特定的Attribute类。 例如 我的语言中的以下代码: Print(message:”Hello stackoverflow”) 会产生以下AST: alt text http://img36.imageshack.us/img36/1672/simpleast.png 我目前的想法是工厂类可以读取树,提取名称( message ),并键入( STRING )值(“ Hello stackoverflow ”)。 现在,知道我可以实现正确类(例如,一个StringAttribute类)并传入所需属性数据的类型 – name和value 。 可以将相同的方法用于定义工厂,提取定义名称( Print ),实例化Print类,然后传入属性工厂生成的属性。 对于更复杂的程序,事情会变得更复杂: Program(args:[1,2,3,4,5]) { If(isTrue:IsInArray(array:{Program.args} value:5)) { Then { Print(message:”5 is in the array”) } Else { Print(message:”More complex ” + “message”) } } } alt text http://img205.imageshack.us/img205/3452/complexast.png 任何/所有的帮助或想法都非常受欢迎。 非常感谢。 […]

Antlr处理exception

我使用AST树使用Antlr 3开发了一个复杂的语法。 ANTLR生成Lexer和Parser。 问题是当用户输入例如无效的语法时,语法期望’;’。 用户没有输入,然后在我的Eclipse IDE中我得到以下exception: line 1:24 mismatched input ” expecting ‘;’ 如何处理此exception,因为我试图捕获此exception,但是没有捕获exception。 这是一个例外吗? 我似乎不明白为什么没有抓到这个exception。 我试图找出答案,但Antlr网站现在似乎已经停止了一段时间。 我查看了以下内容: 使用“$”和Java进行ANTLRexception处理并遵循该示例,但是当Lexer通过添加RuntimeException()生成代码时,我得到了无法访问的代码。 我不知道该怎么做。 当我尝试从解析器中获取语法错误的数量时,它显示0。 编辑: 我找到了一个解决方案,通过查看: ANTLR不会在无效输入上抛出错误 但是,当我尝试获取Exception消息时,它为null。 我是否正确设置了一切? 请参阅示例语法: grammar i; options { output=AST; } @header { package com.data; } @rulecatch { catch(RecognitionException e) { throw e; } } // by having these below it makes no […]

ANTLR:Unicode字符扫描

问题:无法正确打印Unicode字符。 这是我的语法: options { k=1; filter=true; // Allow any char but \uFFFF (16 bit -1) charVocabulary=’\u0000′..’\uFFFE’; } ANYCHAR :’$’ | ‘_’ { System.out.println(“Found underscore: “+getText()); } | ‘a’..’z’ { System.out.println(“Found alpha: “+getText()); } | ‘\u0080′..’\ufffe’ { System.out.println(“Found unicode: “+getText()); } ; 调用词法分析器的main方法的代码片段: public static void main(String[] args) { SimpleLexer simpleLexer = new SimpleLexer(System.in); while(true) { […]

使用javax.lang.model或ANTLR JavaParser获取Java源代码信息的示例/教程

我想为简单的Java Logic创建一个类似流程图的自动化可视化,为此我需要解析Java源代码,我有2个候选者,Java 6的ANTLR和javax.lang.model 。两者都不容易。 我还没有找到一个可以远离我想要实现的工作示例。 我想找到简单的变量声明,赋值和流(if,for,switch,boolean conditions等) 这些中的任何一个都有简单的示例或教程吗? 我发现很少有ANTLR示例(其中没有一个是开箱即用的,没有重要的“家庭作业”),绝对没有javax.lang.model

获取Antlr规则的原始文本

我是一名ANTLR初学者,想要计算符号的SHA1-Hash。 我的简化示例语法: grammar Example; method @after{calculateSha1($text); }: ‘call’ ID; ID: ‘A’..’Z’+; WS: (‘ ‘|’\n’|’\r’)+ {skip(); } COMMENT: ‘/*’ (options {greedy=false;}: .)* ‘*/’ {$channel=HIDDEN} 当词法分析器删除所有空格时,不同的字符串call /* DEF */ ABC不幸的是call /* DEF */ ABC获得相同的SHA1-Hash值。 是否有可能在开始和结束标记之间获取规则的“原始”文本以及所有跳过的空格和其他通道的文本? (我想到的一种可能性是成员WS -and COMMENT -lexer规则中的所有字符,但是还有更多规则,所以这不太实用。) 我使用标准的ANTLRInputStream来提供Lexer,但我不知道如何接收原始文本。

在ANTLR 3中,如何在运行时而不是提前生成词法分析器(和解析器)?

我想在运行时生成一个antlr词法分析器 – 也就是说,生成语法并从语法生成lexer类,并在运行时生成它的支持位。 我很乐意将它提供给java编译器,它可以在运行时访问。

如何获取antlr4规则匹配的原始文本?

使用Java 7语法https://github.com/antlr/grammars-v4/blob/master/java7/Java7.g4我想找到具有特定名称的方法,然后打印出该方法。 我看到匹配时我可以使用methodDeclaration规则。 所以我将Java7BaseListener子类Java7BaseListener并覆盖此侦听器方法: @Override public void enterMethodDeclaration(Java7Parser.MethodDeclarationContext ctx) { } 如何获取原始文本? ctx.getText()给我一个字符串,其中删除了所有空格。 我想要评论和原始格式。

使用ANTLR为java源代码生成抽象语法树

如何使用ANTLR从java src代码生成AST? 任何帮助?

在C#中使用ANTLR ASTs的教程?

是否有人知道在C#中使用ANTLR生成的AST的教程? 我能找到的最接近的是这个 ,但它并不是非常有用。 我的目标是根据我正在使用的特定于域的语言遍历我正在生成的树,并使用树来输出生成的C#代码。 基于Java的教程也很有帮助 – 任何提供如何遍历ANTLR AST的明确示例的东西。

在Java和ANTLRWorks调试器中捕获ANTLR的NoViableAltException

考虑我们尝试将一些不正确的输入文本提供给某些语法(例如包含一些未知标记的文本)。 在ANTLRWorks期间的ANTLRWorks中,我们将在图中看到NoViableAltException 。 UPD:出现此exception有两种情况: 1)意外使用了一些已知的令牌,在这种情况下,我们将收到类似于line 5:36 no viable alternative at input ‘,’ 2)使用未知令牌类型。 例如,语法对于以@符号开头的标记一无所知。 我们正试图用这样的标记为我们的语法提供文本。 不幸的是, 在情况(2)中,在ANTLRWorks调试器中既没有抛出此exception ,也没有在生成的Java代码中抛出exception ; 但只有在ANTLRWorks解释器的结果图中ANTLRWorks看到它。 我也尝试将以下标准代码添加到我的语法中: @parser::members { private IErrorReporter errorReporter = null; public void setErrorReporter(IErrorReporter errorReporter) { this.errorReporter = errorReporter; } public void emitErrorMessage(String msg) { errorReporter.reportError(msg); } } @lexer::members { … the same code as above … } […]