Javascript LL(1)解析时如何构建AST
我正在编写一个LL(1)解析器,该解析器工作得非常好。Javascript LL(1)解析时如何构建AST,javascript,parsing,compiler-construction,stack,abstract-syntax-tree,Javascript,Parsing,Compiler Construction,Stack,Abstract Syntax Tree,我正在编写一个LL(1)解析器,该解析器工作得非常好。 但是解析器的所有目标都是处理令牌并生成AST。 我想知道在进行解析时如何管理对象以构建AST 我的代码: while (tokens.length) { let currentRule = rulesStack.pop(); let currentToken = tokens[0]; if (isTerminal(currentRule)) { // `S`->nonTerminal, `2`->T
但是解析器的所有目标都是处理令牌并生成AST。 我想知道在进行解析时如何管理对象以构建AST 我的代码:
while (tokens.length) {
let currentRule = rulesStack.pop();
let currentToken = tokens[0];
if (isTerminal(currentRule)) { // `S`->nonTerminal, `2`->Terminal
if (currentRule === currentToken) tokens.shift();//[`3`,`+`,`2`] => [`+`,`2`]
else {
// throw error
return;
}
} else { // currentRule is not Terminal
let nextRule = parseTable[currentRule][currentToken];
if (nextRule) { // if exists
if (nextRule[0] === 'epsilon') {
// do nothing
} else rulesStack.push(...nextRule);
} else {
// throw error
return;
}
}
}
在这个解析器中构建AST的正确方法是什么?答案中有一个可能的算法:“从值堆栈中弹出适当数量的值”是什么意思?每个被创建节点的子节点一个。或者,iow,生产rhs上的每个符号一个。一个可能的算法是在这个答案中:你所说的“从值堆栈中弹出适当数量的值”是什么意思?一个用于正在创建的节点的每个子节点。或者,照此,生产rhs上的每个符号对应一个。