gpt4 book ai didi

python - LALR 语法、尾随逗号和多行列表分配

转载 作者:行者123 更新时间:2023-11-28 17:51:06 24 4
gpt4 key购买 nike

我正在尝试为一种由赋值组成的非常简单的语言生成 LALR 语法。例如:

foo = "bar"
bar = 42

该语言还应该处理值列表,例如:

foo = 1, 2, 3

但我也想处理多行列表:

foo = 1, 2
3, 4

尾随逗号(用于单例和语言灵 active ):

foo = 1,
foo = 1, 2,

显然,两者同时存在:

foo = 1,
2,
3,

我能够编写带有尾随逗号或多行列表的语法,但不能同时用于两者。

我的语法是这样的:

content : content '\n'
: content assignment
| <empty>

assignment : NAME '=' value
| NAME '=' list

value : TEXT
| NUMBER

list : ???

注意:我需要语法中的'\n'来禁止这种代码:

foo
=
"bar"

提前致谢

安托万。

最佳答案

看起来您的配置语言本质上是自由形式的。我会忘记让换行符成为语法中的标记。如果你想要换行限制,你可以把它作为一些词法搭配规则来破解,解析器调用一个添加到词法分析器的小 API 来通知词法分析器它在语法中的位置,词法分析器可以决定是否接受换行符或因错误而拒绝它们。

试试这个语法。

%token NAME NUMBER TEXT

%%

config_file : assignments
| /* empty */
;

assignments : assignment
| assignments assignment
;

assignment : NAME '=' values comma_opt

comma_opt : ',' | /* empty */;

values : value
| values ',' value
;

value : NUMBER | TEXT ;

它为我构建,没有冲突。我没有运行它,但随意阅读 y.output 看起来转换是正常的。

当然,这个语法允许

foo = 1, 2, 3, bar = 4, 5, 6 xyzzy = 7 answer = 42

无需与词法分析器进行额外通信。

您的限制意味着只能在值中换行。两个 NAME 标记绝不能出现在同一行,并且 = 必须与前面的 NAME 出现在同一行(可能第一个值也必须出现)。

基本上当解析器扫描第一个值时,它可以告诉词法分析器“现在正在扫描值,打开换行符”。然后当 comma_o​​pt 减少时,可以再次将其关闭。当 comma_o​​pt 减少时,词法分析器可能已经读取了下一个赋值的 NAME 标记,但它可以检查这是否发生在与之前的 不同的行上姓名。无论如何,您都会希望您的词法分析器跟踪准确的行数。

关于python - LALR 语法、尾随逗号和多行列表分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9693071/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com