You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写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;
}

修正说明

  1. 添加EOF匹配:在stmt规则中加入EOF标记,强制要求解析器必须消耗完所有输入内容才能判定为合法,解决了部分匹配即输出Valid的问题。
  2. 简化语法规则:将原S规则拆分为空规则、嵌套括号对、并列括号对三种情况,逻辑更清晰,避免回溯导致的错误匹配。
  3. 空白字符处理:LEX中添加空白字符忽略规则,允许输入中包含空格、制表符或换行,同时保留非法字符的错误触发逻辑。

YACC入门学习资源

  • 《Lex & Yacc》:经典入门书籍,俗称"紫书",详细覆盖Lex和YACC的基础语法、分析原理,搭配大量实用示例,是从零学习的首选资料。
  • GNU Bison官方文档:Bison是YACC的GNU兼容实现,文档包含从入门到进阶的完整教程、示例代码,可通过本地man bison或离线文档查阅。
  • 编译原理课程课件:国内多数高校的编译原理课程会包含YACC的实操教学,课件中的针对性示例和练习能帮助快速掌握核心用法。
  • 开源项目示例:参考GitHub上的小型解析器项目(如简单表达式计算器),通过模仿实际代码理解YACC在真实场景中的应用。

内容的提问来源于stack exchange,提问作者Mohammed Khalid Ahmed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 18:05:25