我正在尝试使用 lex 和 yacc 为类似 Lua 的语言编写解析器。它是一种没有强制语句终止符(分号)的语言,这个特性让我无法分辨函数调用是语句还是表达式。
例如,下面的函数:
function foo()
return { x = 5 }
end
将返回一个表。以下是一些用法:
foo() -- this is a statement
t = foo() -- foo is an expression
a = foo().x -- foo() is a prefix-expression
print(foo()) -- foo() is an expression
我无法编写无冲突的 yacc 代码,因为简单的函数调用可以是表达式、前缀表达式或语句。
如何实现此功能?引入强制语句终止符是唯一的方法吗?
非常感谢。