- 论坛徽章:
- 0
|
本帖最后由 DIYBYPERL 于 2013-10-11 22:24 编辑
YACC对应的文件:- %{
- /* 计算器 */
- %}
- %{
- #include <stdio.h>
- #include <stdlib.h>
- #define PRT(n, s, r) {printf("---------[%d:%s][$=%d]\n", n , s, r);}
- extern FILE *yyin;
- void yyerror(const char* s);
- double vbltable[26];
- %}
- %union{
- double dval;
- int vblno;
- }
- %token <vblno> NAME
- %token <dval> NUMBER
- %left '-' '+'
- %left '*' '/'
- %nonassoc UMINUS
- %type <dval> expression
- %%
- statement_list: statement '\n'
- | statement_list statement '\n'
- ;
- statement:
- NAME '=' expression
- { vbltable[$1] = $3; PRT(7, "=", 0);}
- | expression
- { printf("= %d\n", $1);}
- ;
- expression:
- expression '+' expression
- { $ = $1 + $3; PRT(1, "+", $);}
- | expression '-' expression
- { $ = $1 - $3; PRT(2, "-", $);}
- | expression '*' expression
- { $ = $1 * $3; PRT(3, "*", $);}
- | expression '/' expression
- {
- if($3) $ = $1 / $3;
- else yyerror("divided by zero!");
- PRT(4, "/", $);
- }
- | '-' expression %prec UMINUS
- { $ = -$2; PRT(5, "-", $); }
- | '(' expression ')'
- { $ = $2; PRT(6, "()", $); }
- | NUMBER
- { $ = $1; PRT(7, "N", $1);}
- | NAME
- { $ = vbltable[$1]; PRT(8, "NAME", $);}
- ;
- %%
- int main(void)
- {
- yyparse();
- }
- void yyerror(const char* s)
- {
- printf("\n%s\n", s);
- }
复制代码 LEX对应的文件:- %{
- /* 计算器 */
- %}
- %{
- #include "y.tab.h"
- #include <math.h>
- %}
- %%
- ([0-9]+|([0-9]*\.[0-9]+)([Ee][-+]?[0-9]+)?) {
- yylval.dval = atof(yytext);
- return NUMBER;
- }
- [ \t] ;
- [a-z] {
- yylval.vblno = yytext[0] - 'a'; return NAME;
- }
- "$" {
- return 0;
- }
- \n |
- . return yytext[0];
- %%
- int yywrap(void)
- {
- return 1;
- }
复制代码 这两个文件编译后的程序为“ly”,运行结果如下,为什么结果都是0??? 高手指导下!!!是在CENT-OS 6.3上测试的- root:/root/桌面/test/tflex>ly
- 2
- ---------[7:N][$=0]
- = 0
- 2+3
- ---------[7:N][$=0]
- ---------[7:N][$=0]
- ---------[1:+][$=0]
- = 0
复制代码 |
|