Javascript 从函数调用解析中消除左递归

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

首先,我知道关于这个话题有很多答案和资源。然而,我很难理解这些答案中经常使用的语法符号。所以我希望有人能用更直观的方式来解释

我正在尝试为某种C类型的语言编写一个简单的递归下降解析器。但是,我在实现函数调用时遇到了一些问题

我试图支持以下语法:

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
循环。