请求创建符合特定规则的Yacc表达式语法,修复现有语法缺陷
修复Yacc表达式解析语法的问题
你的语法无法解析1;1;\n1;1的核心原因是:当处理到第二个;后的换行符时,语法会匹配expressions NEWLINE规则,将1;1;\n作为新的expressions,但后续的1;1无法匹配任何现有规则——原语法没有定义expressions后直接跟Number的情况,仅允许expressions后接换行符或分号+可选数字。
以下是修改后的语法,可覆盖所有需求场景:
%{ package main %} %union { token Token } %token<token> Number %% start: expressions line_breaks ; expressions: Number | expressions separator Number | expressions separator ; separator: line_breaks SEMICOLON line_breaks | line_breaks ; line_breaks: /* empty */ | line_breaks NEWLINE ; NEWLINE: '\n'; SEMICOLON: ';' ; %%
修改说明
- 新增
line_breaks规则:允许零个或多个连续换行符,覆盖换行的各种出现场景。 - 定义
separator规则:将分号、分号前后的换行、单独换行统一作为分隔符,满足“换行可位于分号前后或单独分隔”的需求。 - 重构
expressions规则:- 支持单个数字
- 支持通过分隔符连接多个数字
- 允许表达式以分隔符结尾(满足最后一个分号可选的规则)
start规则新增line_breaks:允许表达式末尾存在换行符,增强兼容性。
内容的提问来源于stack exchange,提问作者Artem
相关产品推荐
相关产品推荐

