解析变量(递归)
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 等工具生成解析器。根据工具的不同,他们可以轻松处理这些事情,或者至少(通过将语法与操作分开)使执行转换变得更容易。
我正在为我的玩具语言编写一个编译器,仅用于学习和好奇的目的,我已经完成了一些事情,比如数学运算和其他东西,我在尝试解析变量时遇到了一些麻烦 "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 等工具生成解析器。根据工具的不同,他们可以轻松处理这些事情,或者至少(通过将语法与操作分开)使执行转换变得更容易。