LALR语法供电呼叫语句(如Python语法)

发布于 2025-01-19 00:05:45 字数 1070 浏览 1 评论 0原文

我正在尝试为自定义 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文