我想开始使用ANTLR,但是在antlr.org网站上花了几个小时回顾一下这些例子之后,我仍然无法清楚地理解Java进程的语法.
是否有一些简单的例子,比如使用ANTLR实现的四操作计算器,通过解析器定义并一直到Java源代码?
这是原始问题的简化版本.
我有一个名为Person的类:
public class Person {
public string Name { get; set; }
public int Age { get; set; }
public int Weight { get; set; }
public DateTime FavouriteDay { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
......然后说一个例子:
var bob = new Person {
Name = "Bob",
Age = 30,
Weight = 213,
FavouriteDay = '1/1/2000'
}
Run Code Online (Sandbox Code Playgroud)
我想在我最喜欢的文本编辑器中将以下内容写成字符串 ....
(Person.Age > 3 AND Person.Weight > 50) OR Person.Age < 3
Run Code Online (Sandbox Code Playgroud)
我想取这个字符串和我的对象实例并评估一个TRUE或FALSE - 即在对象实例上评估一个Func <Person,bool>.
这是我目前的想法:
我过去曾经使用过lex和yacc(更常见的是bison)用于各种项目,通常是翻译(例如EDIF的子集流入EDA应用程序).另外,我必须支持基于几十年前的lex/yacc语法的代码.所以我知道我的工具,虽然我不是专家.
我在过去的各种论坛上看过关于Antlr的积极评论,我很好奇我可能会缺少什么.因此,如果您同时使用了两者,请告诉我Antlr中哪些更好或更先进.我目前的限制是我在C++商店工作,我们发布的任何产品都不包含Java,因此生成的解析器必须遵循该规则.
片段在ANTLR中意味着什么?
我见过这两条规则:
fragment DIGIT : '0'..'9';
Run Code Online (Sandbox Code Playgroud)
和
DIGIT : '0'..'9';
Run Code Online (Sandbox Code Playgroud)
有什么不同?
我正在尝试使用ANTLR和C#,但由于缺少文档/教程,我发现它非常困难.我找到了几个旧版本的半心半意的教程,但似乎从那时起对API进行了一些重大改动.
谁能给我一个简单的例子来说明如何创建语法并在短程序中使用它?
我终于设法将我的语法文件编译成词法分析器和解析器了,我可以在Visual Studio中编译和运行那些(在重新编译ANTLR源之后,因为C#二进制文件似乎也已经过时了! - 更不用说在没有一些修复的情况下源不会编译),但我仍然不知道如何处理我的解析器/词法分析器类.据说它可以在给出一些输入的情况下产生AST ......然后我应该可以做一些喜欢它的东西.
我一直在寻找很多关于这一点,我找不到任何有用的,真正帮助我建立一个AST.我已经知道ANTLR4不像以前的ANTLR3那样构建AST.每个人都说:"嘿,使用访客!",但我找不到任何示例或更详细的解释如何我这样做...
我的语法必须像C一样,但每个命令都用葡萄牙语(portuga编程语言)编写.我可以使用ANTLR4轻松生成解析树.我的问题是:现在我需要做些什么才能创建AST?
顺便说一下,我正在使用Java和IntelliJ ......
EDIT1:我能得到的最接近的是使用本主题的答案:是否有一个使用antlr4从java源代码创建AST并提取方法,变量和注释的简单示例? 但它只打印访问过的方法的名称..
由于第一次尝试对我不起作用,我试图使用ANTLR3中的这个教程,但我无法弄清楚如何使用StringTamplate而不是ST ...
阅读本书The Definitive ANTLR 4 Reference我也找不到任何与AST有关的内容.
EDIT2:现在我有一个类来创建DOT文件,我只需要弄清楚如何正确使用访问者
java compiler-construction antlr abstract-syntax-tree antlr4
如果我打电话:
java org.antlr.Tool -o outdir sources/com/example/Java5.g
Run Code Online (Sandbox Code Playgroud)
...使用antlr-3.1.3将在目录中生成解析器和词法分析器代码outdir/sources/com/example.但是生成的类没有任何package语句.我需要他们在包装中生活com.example.
有没有办法指定目标包?