我删除%token NUMBER ,改为 %token NUMBER 语法报错

描述:为了了解 表达式含义

例子 insert into t values(1, '2020-09-10')中

  • parser/lexsql.l 定义一个正则表达式token :NUMBER

[\-]?{DIGIT}+          yylval->number=atoi(yytext); RETURN_TOKEN(NUMBER);

  • 在 yacc_sql.y 定义一个token 类型的NUMBER

int number;

%token <number> NUMBER


重现步骤:

yacc_sql.y中类型声明的语法问题

我删除%token <number> NUMBER ,改为 %token  NUMBER  语法报错

bison -d -b yaccsql yaccsql.y  编译 语法错误

 $1 没有任何声明类型 这个不是number表达式吗?怎么缺类型

  265 | NUMBER {$$ = $1;}

   |         ^~~~~~

yacc_sql.y:265.30-31: 错误: “number” 中的 $1 没有任何声明类型

 265 | NUMBER {$$ = $1;}

   |               ^~

yacc_sql.y:307.79-80: 错误: “value” 中的 $1 没有任何声明类型

 307 |   value_init_integer(&CONTEXT->values[CONTEXT->value_length++], $1);

   |                                        ^~

value:

  NUMBER{

 valueinitinteger(&CONTEXT->values[CONTEXT->value_length++], $1);

}


yacc_sql.y

%union {

 int number

}

%token <number> NUMBERi






问题:我删除%token <number>NUMBER ,改为 %token NUMBER 语法报错。

在语法规则value:  NUMBER 中 NUMBER对应的不是正则表达式token呀?

我自己定义:{QUOTE}2020-01-02{QUOTE}    yylval->string=strdup(yytext); RETURN_TOKEN(DATE); 匹配日期token。 不声明为%token <string> DATE 报错