编写YACC代码检查括号匹配遇问题,求修正及入门资源
括号匹配验证代码修正及YACC入门资源推荐
问题分析
现有代码的核心问题在于未强制要求匹配整个输入内容,且语法规则存在歧义,导致未闭合的括号或不完整输入被错误判定为合法。例如输入(或()(时,解析器仅匹配部分内容后就触发Valid输出,忽略了剩余未处理的输入。
修正后的代码
YACC代码
%{ #include<stdio.h> int yylex(); int yyerror(char* err); extern FILE* yyin; %} %token OPENING CLOSING %% stmt : S EOF {printf("Valid\n"); return 0;} S : /* 空规则 */ | OPENING S CLOSING | S S ; %% int main(){ yyin = fopen("input.c", "r"); if (!yyin) { perror("Failed to open input file"); return 1; } yyparse(); return 1; } int yyerror(char* err){ printf("Invalid\n"); return 1; }
LEX代码
%{ #include<stdio.h> #include "y.tab.h" %} %% "(" { return OPENING; } ")" { return CLOSING; } [ \t\n] { /* 忽略空白字符,可选处理 */ } . { return yytext[0]; } %% int yywrap(){ return 1; }
修正说明
- 添加EOF匹配:在
stmt规则中加入EOF标记,强制要求解析器必须消耗完所有输入内容才能判定为合法,解决了部分匹配即输出Valid的问题。 - 简化语法规则:将原S规则拆分为空规则、嵌套括号对、并列括号对三种情况,逻辑更清晰,避免回溯导致的错误匹配。
- 空白字符处理:LEX中添加空白字符忽略规则,允许输入中包含空格、制表符或换行,同时保留非法字符的错误触发逻辑。
YACC入门学习资源
- 《Lex & Yacc》:经典入门书籍,俗称"紫书",详细覆盖Lex和YACC的基础语法、分析原理,搭配大量实用示例,是从零学习的首选资料。
- GNU Bison官方文档:Bison是YACC的GNU兼容实现,文档包含从入门到进阶的完整教程、示例代码,可通过本地
man bison或离线文档查阅。 - 编译原理课程课件:国内多数高校的编译原理课程会包含YACC的实操教学,课件中的针对性示例和练习能帮助快速掌握核心用法。
- 开源项目示例:参考GitHub上的小型解析器项目(如简单表达式计算器),通过模仿实际代码理解YACC在真实场景中的应用。
内容的提问来源于stack exchange,提问作者Mohammed Khalid Ahmed
相关产品推荐
相关产品推荐

