解析变量(递归)

Parse a variable (recursively)

我正在为我的玩具语言编写一个编译器,仅用于学习和好奇的目的,我已经完成了一些事情,比如数学运算和其他东西,我在尝试解析变量时遇到了一些麻烦 "within" a虽然可变。以伪代码为例:

numbers = [1..20]

我的解析器已经理解这一点,以及类似的东西:

ten = numbers[9]

但是,当我有一个由多个 "element" 组成的变量时,例如二维数组或对象中的对象,我无法解析,解析器将自身阻塞在无限循环中。示例:

things = [['one'], ['two'], ['three']]
person = {
  name = 'john'
  car = {
    model = 'ninja'
    price = 23000.0
  }
}

things[1][0]  // This is causing the infinite loop
person.car.price  // And this

这是我的解析器的样子(伪代码):

parseVarReference() {
  variable = expect(TOKEN_IDENTIFIER);
  if (current() == '[') {
    // try to parse array or object or fallback to regular variables
  }
}

现在,在我的脑海中,我会像这样解析一个嵌套变量:

parseVarReference() {
  variable = parseVarReference();
  if (current() == '[') {
    // try to parse array or object or fallback to regular variables
  }
}

显然这会导致无限循环,我无法在不破坏解析器的情况下解决这个问题。

您正在写 recursive descent parser. They can't directly handle left recursion

您可以生成非递归的等价语法,但在您编写的简单递归下降样式中,这可能比您想要的工作量更大。

您可以考虑使用 yacc 等工具生成解析器。根据工具的不同,他们可以轻松处理这些事情,或者至少(通过将语法与操作分开)使执行转换变得更容易。