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
相关产品推荐
相关产品推荐

