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

Bison语法规则问题:如何支持多个用&连接的TABLE_NAME

修改Bison语法以支持任意多个AND连接的表名

你的问题是当前Bison语法仅支持1个或2个用&(对应AND token)连接的TABLE_NAME,无法处理3个及以上的情况。要解决这个问题,核心是用递归非终结符定义重复的表名序列,不用写死固定数量的匹配规则。

修改后的完整代码如下:

%{
    #include <stdio.h>
    #include <stdlib.h>
    #define YYDEBUG 1
    extern int yylineno;
    extern FILE* yyin;
%}

%token CREATE_TABLE CREATE_RECORD_DATA
%token TABLE_NAME RECORD_NUMBER EXPRESSION
%token AND LPAR RPAR PLUS MINUS MULT DIV END
%token WS

%start program

%%

program :
        | program line_start
        ;

// 递归定义表名单:支持1个或多个用AND连接的TABLE_NAME
table_list :
        TABLE_NAME
        | table_list WS AND WS TABLE_NAME
        ;

line_start :
        CREATE_TABLE WS table_list END { printf("Table created in line %d \n", yylineno - 1); }
        |  // 保留空规则处理空行
        ;

%%

int yyerror(char *s){
    printf("Error %s \n",s);
}

int main(int argc, char* argv[]) {
    if (argc != 2) {
        printf("Usage: ./parser <input_file>\n");
        return 1;
    }
    FILE* inputFile = fopen(argv[1],"r");
    if(!inputFile)
    {
        printf("Something not right ! \n");
        return 1;
    }
    yyin = inputFile;
    yyparse();
    fclose(inputFile);
    return 0;
}

关键修改说明

  • 新增table_list非终结符:通过递归方式定义,要么是单个TABLE_NAME,要么是已有的table_list追加WS AND WS TABLE_NAME,以此实现任意数量表名的匹配。
  • 简化line_start规则:将原来写死的1个/2个表名逻辑替换为table_list,统一处理所有数量的合法表名输入。

测试验证

修改后你的测试输入:

create_table table
create_table table & table
create_table table & table & table
create_table taABle2
  • 前三个输入会正常解析并输出创建提示;
  • 第四个不符合TABLE_NAME命名规则的输入依然报错,符合预期。

内容的提问来源于stack exchange,提问作者Thanos Rom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 23:33:13