我仍然在寻求一种非常简单的语言,现在我知道没有.所以我自己用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)
我的意思是这种语义谓词现在似乎不存在.我可以用什么呢?
我有一个相对简单的DSL,我想比一堆手动编码的java.util.regex.Pattern语句+解析逻辑更强大地处理.
最引用的工具似乎是ANTLR.我不熟悉它,我愿意尝试一下.但是当我查看示例时(例如,ANTLR 表达式计算器示例,或Martin Fowler的HelloAntlr,或者stackoverflow上的其他Q),我有点怀疑.这样做的原因是语法文件看起来像是一个语法定义的大杂烩,其中散布着本质上必不可少的实现语言(例如Java)的片段.
我真正喜欢的是分离出解析器的命令/评估部分.有没有办法使用ANTLR(或其他工具)来定义语法并生成一组Java源文件,以便它可以编译成可用于将输入解析为结构的类而无需对该结构进行操作?
例如,如果我只想使用+和*和()运算符一起使用表达式求值,那么我就得到了输入
3*(4 + 7*6)*(3 + 7*(4 + 2))
那么我想要做的就是编写一个语法来将其转换为类似的层次结构
Product
Term(3)
Sum
Term(4)
Product
Term(7)
Term(6)
Sum
Term(3)
Product
Term(7)
Sum
Term(4)
Term(2)
Run Code Online (Sandbox Code Playgroud)
我可以在哪里使用类
interface Expression<T> {
public T evaluate();
}
class Term implements Expression<Double> {
final private double value;
@Override public Double evaluate() { return value; }
}
class Product implements Expression<Double> {
final private List<Expression<Double>> terms;
@Override public Double evaluate() …Run Code Online (Sandbox Code Playgroud) 我有一个语法规则,
OR
: '|';
Run Code Online (Sandbox Code Playgroud)
但是当我用AST打印AST时,
public static void Preorder(ITree tree, int depth)
{
if (tree == null)
{
return;
}
for (int i = 0; i < depth; i++)
{
Console.Write(" ");
}
Console.WriteLine(tree);
for(int i=0; i<tree.ChildCount; ++i)
Preorder(tree.GetChild(i), depth + 1);
}
Run Code Online (Sandbox Code Playgroud)
(感谢巴特)它显示了实际的|角色.有没有办法让我说"或"呢?
我正在读Terence Parr的最终ANTLR参考文献,他说:
语义谓词是一种通过允许运行时信息驱动识别来识别上下文敏感语言结构的强大方法
但书中的例子非常简单.我需要知道的是:ANTLR可以解析上下文相关的规则,例如:
xAy - > xBy
如果ANTLR无法解析这些规则,是否还有另一种工具可以处理上下文敏感的语法?
compiler-construction parsing antlr context-sensitive-grammar
我有一个DSL(用ANTLR实现),我需要编写内容辅助/自动完成编辑器.我已将我的语法原型移植到Xtext,我对它生成的编辑器的质量非常满意.
不幸的是,我不能使用Eclipse作为我的编辑器.相反,我想使用Xtext语法生成一些我可以在Eclipse之外重用的工件.从我所看到的,我需要的最小工件集是:
有没有人试图在Eclipse之外使用Xtext?它依赖多少外部库?
谢谢!
摘要问题描述:
我看到它的方式,unparsing意味着从AST创建一个令牌流,当再次解析时产生一个相等的AST.
所以 parse(unparse(AST)) = AST持有.
这等于找到一个有效的解析树,它将生成相同的AST.
因此,解析者必须通过所有语法约束所包含的遍历节点找到有效的"路径".这基本上意味着找到AST节点到语法生成规则的有效分配.这通常是一个约束满足问题(CSP),可以通过回溯 O(exp(n))来解决,如解析.
幸运的是,对于解析,这可以使用GLR(或更好地限制语法)在O(n³)中完成.因为AST结构非常接近语法生成规则结构,所以我真的很惊讶看到运行时比解析更糟糕的实现:XText使用ANTLR进行解析和回溯以进行解析.
问题
例1:
Area returns AnyObject -> Pedestrian | Highway
Highway returns AnyObject -> "Foo" Car
Pedestrian returns AnyObject -> "Bar" Bike
Car returns Vehicle -> anyObjectInstance.name="Car"
Bike returns Vehicle -> anyObjectInstance.name="Bike"
Run Code Online (Sandbox Code Playgroud)
所以,如果我有一个AST包含
AnyObject -> AnyObject -> Vehicle [name="Car"] 我知道root可以是Area,我可以解决它
Area -> Highway -> Car
Run Code Online (Sandbox Code Playgroud)
因此(公路|行人)决定取决于子树决策.当一片叶子乍一看是几种类型中的一种时,问题会变得更糟,但必须是特定的一种,以便稍后形成有效路径. …
parsing antlr abstract-syntax-tree xtext constraint-satisfaction
我是使用Antlr4的新手,但我知道Eclipse存在一个插件.我有一个简单的问题...在创建g4文件后,我如何可视化实时解析树以查看输入表达式的树?谢谢