LALR语法供电呼叫语句(如Python语法)
我正在尝试为自定义 DSL 编写一个简单的 LALR 解析器。我的语法如下所示:
main : stmts
stmts : expr stmts
|
expr : arithmetics
| function_call
| VARNAME
| INT
arithmetics : expr '+' expr
| expr '-' expr
| expr '*' expr
| expr '/' expr
| '(' expr ')'
function_call : VARNAME '(' arg_list ')'
arg_list : expr ',' arg_list
| expr
我可以编写简单的算术和函数调用,但我面临歧义问题。
例如,a (2)
可以被视为使用参数2
调用的函数a
。 或者它可以被视为两个不同的语句:首先是a
,然后是括号括起来的数字2
。当遇到 '(' 时,我面临着移位/归约冲突,因为它既可以用于算术运算,也可以用于进行函数调用。
以下是生成 a (2)
的两种不同方法:
stmts -> expr -> function_call -> VARNAME ( arg_list ) -> VARNAME ( expr ) -> a ( 2 )
stmts -> expr stmts -> expr expr -> VARNAME arithmetics -> VARNAME ( expr ) -> a ( 2 )
如何我消除了这样的语法的歧义吗?
我注意到Python语法允许毫无歧义地编写这样的东西:
def a(x):
return x+2
a
(5)
(2)
a
a
a
(8)
print(
a
(9)
)
我怎样才能改变我的语法以使其类似地工作? 谢谢。
I'm trying to write a simple LALR parser for a custom DSL. My grammar looks like this :
main : stmts
stmts : expr stmts
|
expr : arithmetics
| function_call
| VARNAME
| INT
arithmetics : expr '+' expr
| expr '-' expr
| expr '*' expr
| expr '/' expr
| '(' expr ')'
function_call : VARNAME '(' arg_list ')'
arg_list : expr ',' arg_list
| expr
I can write simple arithmetics and function calls, but I'm facing an ambiguation problem.
For instance a (2)
could be either seen as the function a
called with parameter 2
.
Or it could be seen as two distinct statements : first a
, then the number 2
surrounded by parenthesis. I'm facing shift/reduce conflicts when '(' is encountered as it can be either used in arithmetics operation and to make function calls.
Here are two different ways to produce a (2)
:
stmts -> expr -> function_call -> VARNAME ( arg_list ) -> VARNAME ( expr ) -> a ( 2 )
stmts -> expr stmts -> expr expr -> VARNAME arithmetics -> VARNAME ( expr ) -> a ( 2 )
How can I desambiguate such a grammar ?
I noticed that the Python grammar allows to write such things without ambiguity :
def a(x):
return x+2
a
(5)
(2)
a
a
a
(8)
print(
a
(9)
)
How can I make my grammar change to make it work similarly ?
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论