C 我在flex/bison中的所有代币都显示为未声明
我正在用 yacc-d calclang.yC 我在flex/bison中的所有代币都显示为未声明,c,bison,yacc,flex-lexer,lex,C,Bison,Yacc,Flex Lexer,Lex,我正在用 yacc-d calclang.y %{ #include <stdlib.h> #include <stdio.h> void yyerror(const char *str); %} %union { int ival; float fval; char* word; } %start line %type <word> wexp %type <ival> iexp %type <fval&g
%{
#include <stdlib.h>
#include <stdio.h>
void yyerror(const char *str);
%}
%union
{
int ival;
float fval;
char* word;
}
%start line
%type <word> wexp
%type <ival> iexp
%type <fval> fexp
%left PLUS MINUS
%left STAR DIV MOD
%left POW
%token GT
%token LT
%token ASGN
%token LP
%token RP
%token LB
%token RB
%token NOT
%token GTEQ
%token LTEQ
%token EQTO
%token NOTEQ
%token HORN
%token QMARK
%token <word> WORD
%token <fval> FLOAT
%token <ival> INTEGER
%%
line : HORN wexp QMARK { printf("=\t%s", $2); }
| HORN iexp QMARK { printf("=\t%d", $2); }
| HORN fexp QMARK { printf("=\t%f", $2); }
;
iexp : iexp MINUS iexp { $$ = $1 - $3; }
| iexp PLUS iexp { $$ = $1 + $3; }
| INTEGER { $$ = $1; }
;
fexp : FLOAT { $$ = $1; }
;
wexp : WORD { $$ = $1; }
;
%%
int main(){
return yyparse();
}
void yyerror(const char *str)
{
printf("error: %s\n",str);
}
我看过其他的帖子,他们说有#include y.tab.h
但我已经有了。所以我遇到了一个障碍。为什么我所有的代币都没有申报?
谢谢大家! 这与您的问题没有直接关系(据我所知),但肯定需要解决:
"horn" | "HORN" { return HORN; }
Flex正则表达式不能有空格。flex将其解析为|
操作,而不是正则表达式操作符,尽管它不是有效的|
操作,因为这应该是行中的最后一个标记。我认为flex的大多数版本只会忽略其余部分,但我并不确定。您应该删除以下空格:
"horn"|"HORN" { return HORN; }
此外,此处的操作(以及其他一些行中的操作):
编译时应生成警告,因为
return
语句后面的语句永远不会执行。(您应该在gcc命令中使用-Wall
来查看警告。)换句话说,普通C代码中的操作,因此无法执行对yylval.ival
的赋值。这与您的问题没有直接关系(据我所知),但它肯定需要修复:
"horn" | "HORN" { return HORN; }
Flex正则表达式不能有空格。flex将其解析为|
操作,而不是正则表达式操作符,尽管它不是有效的|
操作,因为这应该是行中的最后一个标记。我认为flex的大多数版本只会忽略其余部分,但我并不确定。您应该删除以下空格:
"horn"|"HORN" { return HORN; }
此外,此处的操作(以及其他一些行中的操作):
编译时应生成警告,因为
return
语句后面的语句永远不会执行。(您应该在gcc命令中使用-Wall
来查看警告。)换句话说,普通C代码中的操作,因此无法执行对yylval.ival
的赋值。这与您的问题没有直接关系(据我所知),但它肯定需要修复:
"horn" | "HORN" { return HORN; }
Flex正则表达式不能有空格。flex将其解析为|
操作,而不是正则表达式操作符,尽管它不是有效的|
操作,因为这应该是行中的最后一个标记。我认为flex的大多数版本只会忽略其余部分,但我并不确定。您应该删除以下空格:
"horn"|"HORN" { return HORN; }
此外,此处的操作(以及其他一些行中的操作):
编译时应生成警告,因为
return
语句后面的语句永远不会执行。(您应该在gcc命令中使用-Wall
来查看警告。)换句话说,普通C代码中的操作,因此无法执行对yylval.ival
的赋值。这与您的问题没有直接关系(据我所知),但它肯定需要修复:
"horn" | "HORN" { return HORN; }
Flex正则表达式不能有空格。flex将其解析为|
操作,而不是正则表达式操作符,尽管它不是有效的|
操作,因为这应该是行中的最后一个标记。我认为flex的大多数版本只会忽略其余部分,但我并不确定。您应该删除以下空格:
"horn"|"HORN" { return HORN; }
此外,此处的操作(以及其他一些行中的操作):
编译时应生成警告,因为
return
语句后面的语句永远不会执行。(您应该在gcc命令中使用-Wall
来查看警告。)换句话说,普通C代码中的操作,因此无法执行对yylval.ival
的赋值。编译yacc文件时使用-d选项。-d选项将写入y.tab.h头文件。这是因为lex没有识别任何令牌
$lex filename.l
$yacc -d filename.y
$cc lex.yy.c y.tab.c -ll -ly
希望这有帮助:)编译yacc文件时使用-d选项。-d选项将写入y.tab.h头文件。这是因为lex没有识别任何令牌
$lex filename.l
$yacc -d filename.y
$cc lex.yy.c y.tab.c -ll -ly
希望这有帮助:)编译yacc文件时使用-d选项。-d选项将写入y.tab.h头文件。这是因为lex没有识别任何令牌
$lex filename.l
$yacc -d filename.y
$cc lex.yy.c y.tab.c -ll -ly
希望这有帮助:)编译yacc文件时使用-d选项。-d选项将写入y.tab.h头文件。这是因为lex没有识别任何令牌
$lex filename.l
$yacc -d filename.y
$cc lex.yy.c y.tab.c -ll -ly
希望这有帮助:)检查生成的
y.tab.h
文件以验证它定义了所有预期的符号,并检查生成的lex.yy.c
以验证它实际上是否包含?此外,编译器在您显示之前是否会发出任何其他警告或错误消息?y.tab.h具有所有定义,但lex.yy.c没有#include for y.tab.h。关于为什么会发生这种情况,有什么理论吗?@ChrisPhillips:include不是在lex.yy.c的开头。你确定它不存在吗?文件中可能有几百行;您需要使用文本编辑器或grep进行搜索。在我的系统上一切正常;您使用的是什么版本的flex和bison?flex 2.5.35 bison 2.5-编辑:我刚刚运行了一个搜索,并且包含在lex.yy.cy中,您的代码对我来说不起作用(从某种意义上说,可以从生成的文件成功构建程序)。如果它对您不起作用,那么您的中间文件可能已经过时——请再次尝试运行flex,并确保确实重新生成了lex.yy.c。另外,确保不同目录中相同名称的不同源文件或中间文件之间不存在混淆的可能性。检查生成的y.tab.h
文件以验证它是否定义了所有预期符号,并检查生成的lex.yy.c
,以验证它实际上#包括sy.tab.h
?此外,编译器是否会在