Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 在为类似Lua的语言编写解析器时,如何判断函数调用是表达式还是语句_Parsing_Lua_Yacc_Lex_Function Call - Fatal编程技术网

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

Parsing 在为类似Lua的语言编写解析器时,如何判断函数调用是表达式还是语句,parsing,lua,yacc,lex,function-call,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-expr

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


非常感谢。

在实现T-SQL解析器时,我有一个类似的任务要解决。最后我把
就好像它在语法中是强制性的,在语法错误时,我会插入一个虚拟的
token终止当前语句,然后让解析器重试缩减


对于我的用例来说,这确实非常有效,也许它也适用于您的用例。

您可以看看EBNF Lua语法:看看它们是如何实现的。从我所看到的来看,简单的函数调用将是表达式/语句的一部分。你只需要重新排列你的语法就行了。(这让它看起来很难看,但可以用yacc解析)