在为类似Lua的语言编写解析器时,我如何判断一个函数调用是表达式还是语句?

我正在尝试使用词法分析器和语法分析器(lex和yacc)编写一个类似Lua的语言的解析器。这是一种没有强制语句终止符号(分号)的语言,这个特性使我无法确定一个函数调用是一个语句还是一个表达式。

例如,下面的函数:

function foo()
  return { x = 5 }
end

将返回一个表。以下是一些用法:

foo()  -- 这是一个语句
t = foo()  -- foo是一个表达式
a = foo().x  -- foo()是一个前缀表达式
print(foo())  -- foo()是一个表达式

我无法编写不冲突的yacc代码,因为一个简单的函数调用可能是一个表达式、前缀表达式或语句。

我如何实现这个特性?引入强制语句终止符号是唯一的方法吗?

非常感谢。

原文链接 https://stackoverflow.com/questions/4162655

点赞
stackoverflow用户88558
stackoverflow用户88558

在实现 T-SQL 解析器时,我有一个类似的任务需要解决。最终我将 ; 作为语法中的必须项,当出现语法错误时,我会插入一个虚拟的 ; 标记来终止当前语句,然后让解析器重新尝试规约。

对于我的使用情况,这种方法非常有效,也许在你的情况下也可以这样做。

2010-11-12 11:53:25