是否有标准的 Backus-Naur 表单来检查列表是否包含一致的令牌类型?

Is there a standard Backus-Naur form for checking that lists contain consistent token types?

提问人:Mackie Messer 提问时间:9/23/2023 更新时间:9/23/2023 访问量:32

问:

我正在使用 PLY 解析 DNET 文件。DNET规范建议的部分语法是(用我的话说):

<value>  -> NUMBER | STRING | ID
<values> -> <value> | <values> COMMA <value>
<list>   -> LPAREN <values> RPAREN | LPAREN RPAREN

如果我不关心在列表中混合令牌类型,这很好用。但是,如果我想确保解析器只生成有效的列表,那么如果我能保证列表中的令牌类型一致,那就太好了。

我的直觉是为每个有效的令牌类型联合定义一个列表生成,然后在需要时使用该列表生成。例如,如果我想保证我有一个令牌列表:STRING

<strings>     -> STRING | <strings> COMMA STRING
<string_list> -> LPAREN <strings> RPAREN | LPAREN RPAREN

但这意味着我必须定义一个 bajillion 不同的列表制作。有没有更聪明的方法可以在解析器级别执行此操作,或者我应该保存这种验证以在我构建的 AST 上执行?

解析 YACC LEX BNF PLY

评论

3赞 500 - Internal Server Error 9/23/2023
这种类型检查通常推迟到语义分析阶段(在构建 AST 之后)。让语法完成所有专业化往往会变得混乱(有时根本无法完成)。
0赞 Mackie Messer 9/23/2023
谢谢。我真的需要听到有人说<3

答: 暂无答案