它们是由编译过程的不同阶段产生的吗?或者它们只是同一个东西的不同名称?
compiler-construction compiler-theory terminology abstract-syntax-tree parse-tree
我在编译器设计书中找到了这两个术语,我想知道每个术语代表什么,以及它们是如何不同的.
我在互联网上搜索,发现解析树也称为具体语法树(CST).
我正在尝试在ParserVisitor中获取更具体的错误消息的行号(访问由antlr生成的解析树).但是,我在这个课程中所拥有的只是上下文ctx,我可以做ctx.getText()但不是getLine().有没有办法做到这一点?
可以ctx.getPayload()在这里使用吗?如果是这样,怎么样?
编辑:我正在使用ANTLR 4来创建java文件.
尝试通过以下方法访问访问者中的行号:
@Override
public Type visitStatAssign(@NotNull BasicParser.StatAssignContext ctx) {
...
// some semantic error detected
int lineNo = ...
System.err.("Semantic error at line " + lineNo);
}
Run Code Online (Sandbox Code Playgroud)
编辑2:我的词法分析器和解析器规则是相当标准的,例如在词法分析器中:
INT : 'int' ;
CHAR : 'char' ;
BOOL : 'bool' ;
STRING : 'string' ;
Run Code Online (Sandbox Code Playgroud)
...在解析器规则baseType中:
baseType : INT | CHAR | BOOL | STRING ;
Run Code Online (Sandbox Code Playgroud) 我想知道SBAR是什么意思,我如何正确地在树中表示这句话?
为什么有2个S?
原句是: After she ate the cake, Emma visited Tony in his room.
(ROOT
(S
(SBAR (IN After)
(S
(NP (PRP she))
(VP (VBD ate)
(NP (DT the) (NN cake)))))
(, ,)
(NP (NNP Emma))
(VP (VBD visited)
(NP
(NP (NNP Tony))
(PP (IN in)
(NP (PRP$ his) (NN room)))))
(. .)))
Run Code Online (Sandbox Code Playgroud) 我目前正在探索设计一个可以在多个阶段转换AST的编译器.我们的想法是,从解析树开始,每次传递都会转换树,直到生成的AST得到优化,并包含生成中间代码所需的树的每个节点中的所有必需信息(在本例中为LLVM IR).树上的传递可能会显着改变其结构,例如通过运算符优先级解析将运算符和操作数列表更改为有序操作的层次结构.请注意,传递可能会使结构的某些部分完全不变.
所以,我的问题是我如何最好(阅读:最容易,尽可能少的重复)代表一个在C++中有多个中间表示的AST?我希望每个阶段的AST版本中的节点类型在编译时遵守它们的不兼容性.我认为关键问题是如何在避免重复代码的同时代表结构中不改变通道的部分?我想这是编译器作者过去多次解决的问题.
请注意,我目前在我的AST中使用Boost Variant而不是普通的运行时多态,并且希望解决方案与它兼容.
在scala 2.10 AST中递归搜索元素的最佳方法是什么?
树可能是power.trees(code)或mirror.mkToolBox().parseExpr(code)
编辑的结果.在2.10.0-RC1 parseExpr中已重命名为parse.
我具体的用例是通过方法名称从给定的类/对象代码中提取方法的代码,但我认为如果以更通用的方式表达,问题将更加相关.
是否可以在使用递归下降解析器检查数据是否与语法匹配的同时生成解析树?
如果是这样,当我递归下降时,我会用什么方法来构建树?
谢谢,Boda Cydo.
注意:我是解析新手.(已经问了几个关于SO的问题,我的情况越来越好了.)
我正在尝试为具有简单数学运算符(+, - ,*,/和括号)的给定字符串生成语法树.给定字符串"1 + 2*3":
http://img248.imageshack.us/img248/3213/misc9928.png
它应该返回一个这样的数组:
["+",
[1,
["*",
[2,3]
]
]
]
Run Code Online (Sandbox Code Playgroud)
我做了一个函数来转换[1,"+",2,"*",3]中的"1 + 2*3".
问题是:我不知道优先考虑某些操作.
我的代码是:
function isNumber(ch){
switch (ch) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '.':
return true;
break;
default:
return false;
break;
}
}
function generateSyntaxTree(text){
if (typeof text != 'string') return [];
var code = text.replace(new RegExp("[ \t\r\n\v\f]", "gm"), "");
var codeArray = [];
var syntaxTree = []; …Run Code Online (Sandbox Code Playgroud) 我正在创建一个文本编辑器,我刚刚编写了突出显示算法,让每个语法以不同的颜色显示,并使用正确的解析树渲染到正确的位置.
我想知道是否有人可以提供我,或测试或一系列测试用例的位置,以确保没有任何东西会破坏.测试用例应涵盖在Web上使用的所有JavaScript语法,包括边缘情况(即包括throw尽管很少使用的语法),DOM创建和操作等.
我添加了以下静态测试用例.它应该涵盖所有语法.
有几点需要注意:由于代码在语法级别上递归解析,因此只需要基本情况.例如,编辑:
一个[1]; 和[1] [2] [3] [4] [5]; 将是相同的语法.由于第二行,只是递归地更多sub而第一行.
我创建的测试用例已移至下面的答案.
今年我一直在研究Perl6中的代码问题,并试图用语法来解析第3天的输入.
给出这种形式的输入:#1 @ 1,3: 4x4和我创建的这个语法:
grammar Claim {
token TOP {
'#' <id> \s* '@' \s* <coordinates> ':' \s* <dimensions>
}
token digits {
<digit>+
}
token id {
<digits>
}
token coordinates {
<digits> ',' <digits>
}
token dimensions {
<digits> 'x' <digits>
}
}
say Claim.parse('#1 @ 1,3: 4x4');
Run Code Online (Sandbox Code Playgroud)
我有兴趣从坐标中提取匹配的实际标记,即id,x + y,以及从结果解析的维度中提取高度+宽度.我知道我可以将它们从生成的Match对象中拉出来Claim.parse(<input>),但我必须深入研究每个语法生成以获得我需要的值,例如
say $match<id>.hash<digits>.<digit>;
Run Code Online (Sandbox Code Playgroud)
这看起来有点乱,是否有更好的方法?
parse-tree ×10
javascript ×2
parsing ×2
antlr ×1
c++ ×1
extract ×1
grammar ×1
raku ×1
scala ×1
scala-2.10 ×1
stanford-nlp ×1
terminology ×1
unit-testing ×1