免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2276 | 回复: 10
打印 上一主题 下一主题

排错:lex yacc ? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-11-17 16:11 |只看该作者 |倒序浏览
lex 输入文件为calc.lex
%{
#include "stdlib.h"
#include "y.tab.h"
#ifndef YYSTYPE
#define YYSTYPE int
#endif
extern YYSTYPE yylval;
%}

integer [0-9]+
%%
{integer}       {
        yylval=atoi(yytext);
        printf("%d",yylval);
        return INTEGER;
}
[ \t] ;
\n      return 0;
. return yytext[0];
%%
int yywrap()
{
        return 1;
}

yacc的输入文件为:
%{
#include "stdio.h"
extern FILE* yyin;
int yylex(void);
%}
%token INTEGER
%left '+' '-'
%%

program:
        program expr '\n'
        | expr  '\n'              { printf("%d\n", $1); }
        ;

expr:
        INTEGER                   { $$ = $1; }
        | expr '+' INTEGER           { $$ = $1 + $3; }
        | expr '-' INTEGER           { $$ = $1 - $3; }
        ;

%%

void yyerror(char *s) {
    fprintf(stderr, "%s\n", s);
}

int main(int argc,char** argv) {
        if(argc<2)
        {
                return -1;
        }
        yyin=fopen(argv[1],"r";
        if(yyin==NULL)
        {
                printf("\nError In open file!\n";
                return -2;
        }
        yyparse();
        fclose(yyin);
        return 0;
}

编译:
yacc -ldv calc.y
lex calc.lex
cc *.c -o calc -lc -lx
成calc

输入文件为tests,内容如下:
3+1-5

运行 calc tests显示错误如下:
Syntax error
315

环境为sco unix 5.06 ,谁能告诉我错在哪个地方?谢谢!!!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2003-11-18 10:06 |只看该作者

排错:lex yacc ?

program:
program expr '\n'
| expr '\n' { printf("%d\n", $1); }
;

上面的规则存在错误。

论坛徽章:
0
3 [报告]
发表于 2003-11-18 11:42 |只看该作者

排错:lex yacc ?

program:
program expr '\n'
| expr '\n' { printf("%d\n", $1); }
;
把'\n'都去掉就行了

论坛徽章:
0
4 [报告]
发表于 2003-11-19 13:11 |只看该作者

排错:lex yacc ?

还是不对

论坛徽章:
0
5 [报告]
发表于 2003-11-19 13:20 |只看该作者

排错:lex yacc ?

这个是我测试的代码,在solaris里可以运行
test.y:
  1. #include "stdio.h"
  2. extern FILE* yyin;
  3. int yylex(void);
  4. %}
  5. %token INTEGER
  6. %left '+' '-'
  7. %%

  8. program: program expr
  9. |expr  { printf("%d\n",$1); }
  10. ;

  11. expr:
  12.   expr '+' INTEGER { $$ = $1 + $3; }
  13. | expr '-' INTEGER { $$ = $1 - $3; }
  14. | INTEGER
  15. ;

  16. %%

  17. void yyerror(char *s) {
  18. fprintf(stderr, "%s\n", s);
  19. }

  20. int main(int argc,char** argv) {
  21. if(argc<2)
  22. {
  23. return -1;
  24. }
  25. yyin=fopen(argv[1],"r");
  26. if(yyin==NULL)
  27. {
  28. printf("\nError In open file!\n");
  29. return -2;
  30. }
  31. yyparse();
  32. fclose(yyin);
  33. return 0;
  34. }
复制代码

test.l

  1. %{
  2. #include "stdlib.h"
  3. #include "y.tab.h"
  4. #ifndef YYSTYPE
  5. #define YYSTYPE int
  6. #endif
  7. extern YYSTYPE yylval;
  8. %}

  9. integer [0-9]+
  10. %%
  11. {integer} {
  12. yylval=atoi(yytext);
  13. printf("%d",yylval);
  14. return INTEGER;
  15. }
  16. [ \t] ;
  17. \n return 0;
  18. . return yytext[0];
  19. %%
  20. int yywrap()
  21. {
  22. return 1;
  23. }
复制代码

论坛徽章:
0
6 [报告]
发表于 2003-11-19 14:01 |只看该作者

排错:lex yacc ?

sco unix 5.06 下面还是有问题。解析时,好象把文件中的'+' '-'号去掉了
eg,tests 文件内容为
3+4-1
会报:
Syntax error
341

论坛徽章:
0
7 [报告]
发表于 2003-11-19 14:33 |只看该作者

排错:lex yacc ?

请问大侠, 这lex yacc 主要应用在什么地方呀?

论坛徽章:
0
8 [报告]
发表于 2003-11-19 15:18 |只看该作者

排错:lex yacc ?

341是在test.l中由printf打印出来的,'+''-'本来就不会打印出来。我又重新编译运行了一遍,还是没问题啊。
这是我的makefile:
[code][#LEX = lex
#YACC = yacc

CC = cc -DYYDEBUG=1
test: y.tab.c lex.yy.c y.tab.h
        $(CC) -o test y.tab.c lex.yy.c -ly -ll

y.tab.c y.tab.h: test.y
        $(YACC) -d test.y

lex.yy.c: test.l
        $(LEX) test.l/code]
我的系统:SunOS  5.8 Generic_108528-13 sun4u sparc SUNW,Sun-Fire-880
而且在Redhat 7.2上编译执行也没问题。

论坛徽章:
0
9 [报告]
发表于 2003-11-19 15:23 |只看该作者

排错:lex yacc ?

回mengwg:
lex可以说是词法分析器生成程序,yacc是语法的

论坛徽章:
0
10 [报告]
发表于 2003-11-19 15:31 |只看该作者

排错:lex yacc ?


  1. lex可以说是词法分析器生成程序,yacc是语法的
复制代码


谢谢!

我也做了个解析器,包括语法和句法,类似c的,感觉用起来比较简单。
下面是个句法解析的例子:


  1. #include <cline.h>;
  2. #include <stdio.h>;

  3. int user_func_iadd(int a,int b)
  4. {
  5.   return a+b;
  6. };

  7. double user_func_fadd(double a,double b)
  8. {
  9.   return a+b;
  10. };

  11. TParaMgr Para;
  12. TLine    Line;

  13. int Exam_Run_Line(char * line)
  14. {
  15. char s_res[200];

  16.   printf("expression is: %s \n",line);
  17.   Line.Run_Line(line,s_res);
  18.   if(Line.HaveError())
  19.   {
  20.     printf("\nline err :'%s'\n",Line.GetErrorMsg());
  21.     return 0;
  22.   };
  23.   printf("run result is: %s\n\n",s_res);
  24.   return 1;
  25. };

  26. int main()
  27. {
  28. int      i_res;
  29. float    f_res;
  30. char     s_res[200];
  31. char     express[100];

  32.   printf("\n\n");
  33.         puts("     *****************************************************************");
  34.         puts("     *    this orient c++ lib csp module demo                        *");
  35.   puts("     *                      [www.onlyit.cn]   mengwg 2003            *");
  36.         puts("     *****************************************************************");
  37.   
  38.   Define_Modu("iadd","II",(char *)&user_func_iadd,'I');
  39.   Define_Modu("fadd","FF",(char *)&user_func_fadd,'D');

  40.   Line.SetParaMgr(&Para);

  41.   Para.PushPara("x",100.23);
  42.   Para.PushPara("y",200);

  43.   Exam_Run_Line("x");
  44.   Exam_Run_Line("y");  
  45.   Exam_Run_Line("1+2");
  46.   Exam_Run_Line("1+2*3.2");
  47.   Exam_Run_Line("x+y*2-6.5+y");
  48.   Exam_Run_Line("x+y-iadd(10.2,y)");
  49.   Exam_Run_Line("x+y+iadd(10.2,y)*2+x");
  50.   Exam_Run_Line("x+iadd(3,iadd(3,2))*2+10");
  51.   Exam_Run_Line("x>;100&&y==200");
  52.   Exam_Run_Line("x<100");
  53.   Exam_Run_Line("x=80");
  54.   Exam_Run_Line("x<100");

  55.   strcpy(express,"x+y");
  56.   printf("result type of %s is %c\n\n",express,Line.Get_Line_Type(express));
  57.   strcpy(express,"iadd(x+y,3.2)");
  58.   printf("result type of %s is %c\n\n",express,Line.Get_Line_Type(express));
  59.   getchar();
  60.   return 1;
  61. }
复制代码


result:

  1.      *****************************************************************
  2.      *    this orient c++ lib csp module demo                        *
  3.      *                      [www.onlyit.cn]   mengwg 2003            *
  4.      *****************************************************************
  5. expression is: x
  6. run result is: 100.230003

  7. expression is: y
  8. run result is: 200

  9. expression is: 1+2
  10. run result is: 3

  11. expression is: 1+2*3.2
  12. run result is: 7.400000

  13. expression is: x+y*2-6.5+y
  14. run result is: 693.729980

  15. expression is: x+y-iadd(10.2,y)
  16. run result is: 90.230011

  17. expression is: x+y+iadd(10.2,y)*2+x
  18. run result is: 820.459961

  19. expression is: x+iadd(3,iadd(3,2))*2+10
  20. run result is: 126.230003

  21. expression is: x>;100&&y==200
  22. run result is: 1

  23. expression is: x<100
  24. run result is: 0

  25. expression is: x=80
  26. run result is: 80.000000

  27. expression is: x<100
  28. run result is: 1

  29. result type of x+y is F

  30. result type of iadd(x+y,3.2) is I
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP