当前位置:  技术问答>linux和unix

lex&yacc Segmentation fault

    来源: 互联网  发布时间:2017-04-08

    本文导语:  最近要写一个shell程序,用lex和yacc解析命令,写了一个简单的规则,但是运行的时候就出现Segmentation fault(core dumped)错误。麻烦大家帮我看看吧 token.l %{ #include  #include "parser.tab.h" void yyerror(char *); int yywrap(); %}...

最近要写一个shell程序,用lex和yacc解析命令,写了一个简单的规则,但是运行的时候就出现Segmentation fault(core dumped)错误。麻烦大家帮我看看吧
token.l


%{
#include 
#include "parser.tab.h"

void yyerror(char *);
int yywrap();
%}
%%
[a-zA-Z0-9-] {yylval = *yytext; return STRING;}
[ /t] ; 

. yyerror("Invalid character");

%%

int yywrap()
{
        return 1;
}



parser.y

%{
#include 
#include 
#include "functions.h"

#define YYSTYPE char*
YYSTYPE yylva;

int yylex();
void yyerror(char *);

%}
%token STRING
%%
line            :
                        |command
                        {
                        print_test();
                        }
                        ;
command         :fgcommand
                        |fgcommand '&'
                        {
                                make_command(0,NULL);
                        }
                        ;
fgcommand       :simple_cmd
                  {
                  push_command();
                  }
                        ;
simple_cmd      :prog_invocation input_redirect output_redirect
                   ;
prog_invocation:STRING args
                           {
                                make_command(1,$1);
                           }
                           ;
input_redirect:
                          |'' STRING
                           {
                           make_command(3,$2);
                           }
                           ;
args:
        |args STRING
        {
        make_command(1,$2);
        }
        ;
%%
void yyerror(char *s)
{
        printf("%sn",s);
}

int main()
{
        yyparse();
        return 0;
}



其中make_command()函数为:

void make_command(int type,char *str)
{
        if(type == 0) // a back ground command
        {
                is_back = 1;
        }
        else if(type == 1)              // command args
        {
                strcpy(cmd_buff[arg_index ++],str);
        }
        else if(type == 2)              // input file name
        {
                strcpy(input_file,str);
        }
        else if(type == 3)              // output file name
        {
                strcpy(output_file,str);
        }
}


这个函数的功能就是想要将解析得到的结果存储下来。麻烦大家帮忙看看啊

|
lex与yacc本身分析看起来没问题,出错可能在strcpy,特别是strcpy(cmd_buff[arg_index ++],str);有可能会溢出

|
使用core文件和gdb调试一下;
检查一下strcpy的第一个参数的合法性,不能是这些情况:
char *example = NULL;
char *example = "abc";
char *example = (char *)0;
在想example赋值时会出错;

其他的没仔细看,也看不懂。。。囧。。。

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux下的lex&yacc
  • 哪有lex和yacc的资料和教程,小弟跪求
  • 请问谁有关于yacc和lex/flex的资料?
  • 请问前辈们设计source整理工具,使用lex+yacc好还是perl?
  • lex yacc 中遇到的一些疑问???
  • Lex/YACC 高手请进,求分析C语言语法例子
  • lex and yacc编译错误,gcc: compilation of header file requested
  • 请问solaris下lex命令的用法?
  • 找不到Lex命令
  • 关于"/"(斜线)在lex(not flex)中的使用问题
  • LEX词法分析器怎么用?
  • 哪儿有O'Reilly:lex与yac(第二版)的电子图书下?
  • lex问题
  • lex.yy.c 文件中要 include 一个叫做 unistd.h 的头文件,是做什么用的?
  • 词法分析器生成工具 Lex
  • LEX 如何转换文件?
  • help!: yyac & lex in linux
  • ##熟悉LEX的请进##解决立刻给分##
  • 怎样去理解lex中的BEGIN语句??(看下给出的简单例子,谢谢先!)
  • 在使用TC编译由 lex 生成的.c文件时遇到的一些问题,请高手指教!!!
  • IT科技资讯 iis7站长之家


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,