C++ LEX:分段错误:11

C++ LEX:分段错误:11,c++,c,segmentation-fault,lex,C++,C,Segmentation Fault,Lex,我有一个独立的LEX程序(意味着尚未与YACC关联)。可以编译。但当我运行它时,我得到如下错误消息: 分段错误:11 成功读取多个链接时发生此错误消息 你能帮我解决这个问题吗 谢谢大家! 代码: %{ #包括 typedef int-YYSTYPE; 外部的YYSTYPE yylval; 整数检查; int假人; int val1; int val2; 字符*网络名称; int扇出者; int fanins; 字符*网络名称; char*GATE_ASCI; char*GATE_类型; 字符*来

我有一个独立的LEX程序(意味着尚未与YACC关联)。可以编译。但当我运行它时,我得到如下错误消息:

分段错误:11

成功读取多个链接时发生此错误消息

你能帮我解决这个问题吗

谢谢大家!

代码:

%{
#包括
typedef int-YYSTYPE;
外部的YYSTYPE yylval;
整数检查;
int假人;
int val1;
int val2;
字符*网络名称;
int扇出者;
int fanins;
字符*网络名称;
char*GATE_ASCI;
char*GATE_类型;
字符*来自;
int fan_net;
%}
%启动B C D E F
网络名称[0-9]
ASCI_门[0-9a-zA-Z]+
源门类型[a-zA-Z]+
扇出数[0-9]
法宁斯人数[0-9]
输入列表1[0-9]
输入列表2[0-9]
空格[\t\n]+
扇形网[0-9a-zA-Z]+
数字[0-9]
字符[a-zA-Z]+
%%
“*”*\n{
开始一段时间;
//yylval.string=strdup(yytext);
/*printf(“我在这里发表评论”)*/
//返回(评论);
}
{NET_NAME}{
开始B;
net_name=strdup(yytext);
/*yylval.number=atoi(yytext)*/
printf(“%s”,网络名称);
}
{ASCI_GATE}{
开始C;
GATE_ASCI=strdup(yytext);
printf(“%s”,大门);
}
{SOURCE_GATE_TYPE}{
检查=查找门类型(yytext);
如果(检查!=0){
开始D;
闸门类型=标准向上(yytext);
printf(“%s”,门类型);
}
否则{
/*printf(“我在这里来自\n”)*/
开始E;
from=strdup(yytext);
printf(“%s”,来自);
}
}
{NUM_FANOUTS}{SPACE}{NUM_FANINS}{
/*printf(“NUM_FANOUTS NUM_FANINS\t”)*/
扇出=atoi(&yytext[0]);
fanins=atoi(&yytext[2]);
printf(“%d%d”,扇形输出,扇形输入);
/*开始F*/
/*yylval.number=atoi(yytext)*/
/*printf(“我在扇形输出中\n”)*/
开始一段时间;
}
{FAN_NET}{
开始一段时间;
fan_net=strdup(yytext);
printf(“%s”,扇形网);
}
{位数}{
开始一段时间;
val1=atoi(&yytext[0]);
val2=atoi(&yytext[1]);
printf(“%d%d”,val1,val2);
}
“>sa”[0-1]{
printf(“%s”,文本);
}
%%
查找门类型(字符*字符串\u传递){
char*string_cmp=“from”;
if(strcmp(字符串通过,字符串cmp)==0){
/*printf(“我在这里从函数\n”)*/
返回0;
}
否则{
返回1;
}
}
int main(int argc,char*argv[]){
//int-argc;
//字符**argv;
如果(argc>1){
文件*文件;
file=fopen(argv[1],“r”);
如果(!文件){
fprintf(stderr,“无法打开%s\n”,argv[1]);
}否则{
printf(“读取”\n);
yyin=文件;
}   
yylex();
返回0;
/*fclose(文件)*/
}
}
int-yywrap(无效)
{
返回1;
}

正如建议的那样,编译器警告是开始的地方:

$ gcc -Wall -c lex.yy.c 2>&1 |sed -e 's/^/    /'
foo.l: In function ‘yylex’:
foo.l:42:3: warning: implicit declaration of function ‘strdup’ [-Wimplicit-function-declaration]
foo.l:42:14: warning: incompatible implicit declaration of built-in function ‘strdup’ [enabled by default]
foo.l:51:15: warning: incompatible implicit declaration of built-in function ‘strdup’ [enabled by default]
foo.l:57:3: warning: implicit declaration of function ‘find_gate_type’ [-Wimplicit-function-declaration]
foo.l:60:19: warning: incompatible implicit declaration of built-in function ‘strdup’ [enabled by default]
foo.l:68:15: warning: incompatible implicit declaration of built-in function ‘strdup’ [enabled by default]
foo.l:90:14: warning: incompatible implicit declaration of built-in function ‘strdup’ [enabled by default]
foo.l:90:12: warning: assignment makes integer from pointer without a cast [enabled by default]
foo.l:91:3: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat]
lex.yy.c: In function ‘yy_init_buffer’:
lex.yy.c:1253:5: warning: implicit declaration of function ‘isatty’ [-Wimplicit-function-declaration]
foo.l: At top level:
foo.l:108:3: warning: return type defaults to ‘int’ [-Wreturn-type]
foo.l: In function ‘find_gate_type’:
foo.l:111:5: warning: implicit declaration of function ‘strcmp’ [-Wimplicit-function-declaration]
foo.l: At top level:
lex.yy.c:1048:1: warning: ‘yyunput’ defined but not used [-Wunused-function]
lex.yy.c:1089:1: warning: ‘input’ defined but not used [-Wunused-function]
foo.l: In function ‘main’:
foo.l:140:4: warning: control reaches end of non-void function [-Wreturn-type]
使用标准
string.h
解决不正确的
strings.h
可以减少问题:

$ gcc -Wall -c lex.yy.c 2>&1 |sed -e 's/^/    /'
foo.l: In function ‘yylex’:
foo.l:57:3: warning: implicit declaration of function ‘find_gate_type’ [-Wimplicit-function-declaration]
foo.l:90:12: warning: assignment makes integer from pointer without a cast [enabled by default]
foo.l:91:3: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat]
lex.yy.c: In function ‘yy_init_buffer’:
lex.yy.c:1253:5: warning: implicit declaration of function ‘isatty’ [-Wimplicit-function-declaration]
foo.l: At top level:
foo.l:108:3: warning: return type defaults to ‘int’ [-Wreturn-type]
lex.yy.c:1048:1: warning: ‘yyunput’ defined but not used [-Wunused-function]
lex.yy.c:1089:1: warning: ‘input’ defined but not used [-Wunused-function]
foo.l: In function ‘main’:
foo.l:140:4: warning: control reaches end of non-void function [-Wreturn-type]
编译器指出,
fan_type
被赋值为
strdup
的结果(但它被声明为整数),然后在
printf
语句中用作字符串

使用调试器(我更喜欢),您可能会发现需要修复的其他内容,但编译器警告是首选的起点


顺便说一下,
-Wall
也是一个起点。我通常使用脚本来应用更多选项,例如,我在

中提到的编译器警告,正如建议的那样,是开始的地方:

$ gcc -Wall -c lex.yy.c 2>&1 |sed -e 's/^/    /'
foo.l: In function ‘yylex’:
foo.l:42:3: warning: implicit declaration of function ‘strdup’ [-Wimplicit-function-declaration]
foo.l:42:14: warning: incompatible implicit declaration of built-in function ‘strdup’ [enabled by default]
foo.l:51:15: warning: incompatible implicit declaration of built-in function ‘strdup’ [enabled by default]
foo.l:57:3: warning: implicit declaration of function ‘find_gate_type’ [-Wimplicit-function-declaration]
foo.l:60:19: warning: incompatible implicit declaration of built-in function ‘strdup’ [enabled by default]
foo.l:68:15: warning: incompatible implicit declaration of built-in function ‘strdup’ [enabled by default]
foo.l:90:14: warning: incompatible implicit declaration of built-in function ‘strdup’ [enabled by default]
foo.l:90:12: warning: assignment makes integer from pointer without a cast [enabled by default]
foo.l:91:3: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat]
lex.yy.c: In function ‘yy_init_buffer’:
lex.yy.c:1253:5: warning: implicit declaration of function ‘isatty’ [-Wimplicit-function-declaration]
foo.l: At top level:
foo.l:108:3: warning: return type defaults to ‘int’ [-Wreturn-type]
foo.l: In function ‘find_gate_type’:
foo.l:111:5: warning: implicit declaration of function ‘strcmp’ [-Wimplicit-function-declaration]
foo.l: At top level:
lex.yy.c:1048:1: warning: ‘yyunput’ defined but not used [-Wunused-function]
lex.yy.c:1089:1: warning: ‘input’ defined but not used [-Wunused-function]
foo.l: In function ‘main’:
foo.l:140:4: warning: control reaches end of non-void function [-Wreturn-type]
使用标准
string.h
解决不正确的
strings.h
可以减少问题:

$ gcc -Wall -c lex.yy.c 2>&1 |sed -e 's/^/    /'
foo.l: In function ‘yylex’:
foo.l:57:3: warning: implicit declaration of function ‘find_gate_type’ [-Wimplicit-function-declaration]
foo.l:90:12: warning: assignment makes integer from pointer without a cast [enabled by default]
foo.l:91:3: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat]
lex.yy.c: In function ‘yy_init_buffer’:
lex.yy.c:1253:5: warning: implicit declaration of function ‘isatty’ [-Wimplicit-function-declaration]
foo.l: At top level:
foo.l:108:3: warning: return type defaults to ‘int’ [-Wreturn-type]
lex.yy.c:1048:1: warning: ‘yyunput’ defined but not used [-Wunused-function]
lex.yy.c:1089:1: warning: ‘input’ defined but not used [-Wunused-function]
foo.l: In function ‘main’:
foo.l:140:4: warning: control reaches end of non-void function [-Wreturn-type]
编译器指出,
fan_type
被赋值为
strdup
的结果(但它被声明为整数),然后在
printf
语句中用作字符串

使用调试器(我更喜欢),您可能会发现需要修复的其他内容,但编译器警告是首选的起点


顺便说一下,
-Wall
也是一个起点。我通常使用脚本来应用更多选项,例如,我在

中提到的,您是否尝试在调试器中运行您的程序以确定它何时发生故障?使用-Wall编译并修复它发出的警告