Javascript 从函数调用解析中消除左递归
首先,我知道关于这个话题有很多答案和资源。然而,我很难理解这些答案中经常使用的语法符号。所以我希望有人能用更直观的方式来解释 我正在尝试为某种C类型的语言编写一个简单的递归下降解析器。但是,我在实现函数调用时遇到了一些问题 我试图支持以下语法:Javascript 从函数调用解析中消除左递归,javascript,parsing,grammar,recursive-descent,left-recursion,Javascript,Parsing,Grammar,Recursive Descent,Left Recursion,首先,我知道关于这个话题有很多答案和资源。然而,我很难理解这些答案中经常使用的语法符号。所以我希望有人能用更直观的方式来解释 我正在尝试为某种C类型的语言编写一个简单的递归下降解析器。但是,我在实现函数调用时遇到了一些问题 我试图支持以下语法: a(b) a(b, c) a(b, c)() a(b, c)(d) 正如我所说,我很难理解经常使用的语法符号,因此我将展示我的实现: const functionCall = new Expression((parser) => { pa
a(b)
a(b, c)
a(b, c)()
a(b, c)(d)
正如我所说,我很难理解经常使用的语法符号,因此我将展示我的实现:
const functionCall = new Expression((parser) => {
parser.expect(expression)
parser.expect('(')
if (parser.optional(expression)) {
while (true) {
if (parser.optional(',')) {
parser.expect(expression)
} else {
break
}
}
}
parser.expect(')')
})
const expression = new Expression((parser) => {
parser.either([functionCall, literal])
})
const literal = new Expression((parser) => {
parser.either([{name: 'string_literal'}, {name: 'number_literal'}, {name: 'identifier'}])
})
据我所知,我的语法是(间接地?)左递归的,因为在函数调用中可以匹配的第一件事就是函数调用。如果这个假设是正确的,我就不知道如何消除这种递归。如何(重复)加法?这没什么不同。@rici I gues我确实会遇到同样的问题。我对语法分析不是很熟悉。我读过一些关于递归下降的文章,但不知道如何解决这些问题。在中,请注意
术语
和表达式
中的while
循环。如何(重复)添加?这没什么不同。@rici I gues我确实会遇到同样的问题。我对语法分析不是很熟悉。我读过一些关于递归下降的文章,但不知道如何解决这些问题。在中,请注意术语和表达式中的while
循环。