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

时间:2010-11-12 08:03:32

标签: parsing lua yacc lex function-call

我正在尝试使用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代码,因为简单的函数调用可以是表达式,前缀表达式或语句。
我该如何实现此功能?引入强制语句终止符是唯一的方法吗?

非常感谢。

1 个答案:

答案 0 :(得分:1)

在实现T-SQL解析器时,我有类似的任务需要解决。我最终包含;,好像它在语法中是强制性的,并且在语法错误上我会插入一个虚拟;标记来终止当前语句,然后让解析器重试减少。

对于我的用例,这确实很有效,也许它也适用于你的。