2014-12-21 24 views
0

我正在尝试使用flex和bison为编程语言构建一个简单的解析器。

当我从终端(标准输入)检测它,它总是说,(该yyerror()定制):

Error: syntax error, unexpected SOME_TOKEN, expecting $end, on line: 2 
在第二输入

。换句话说,它只适用于第一次输入。

我只能猜测内部解析堆栈的野牛在第一个语句后没有刷新。

这里是我的野牛代码:

%{ 
#include <stdio.h> 
#include <stdlib.h> 

#define YYDEBUG 1 
%} 

%token TOKEN_DECLARE TOKEN_SET TOKEN_STR TOKEN_SYMBOL EOL 
%error-verbose 

%% 

statement: statement 
    | declare_var EOL { puts("Reach declare EOL branch"); } 
    | set_value EOL { puts("Reach set_value EOL branch"); } 

; 

declare_var: TOKEN_DECLARE TOKEN_SYMBOL { printf("Declare var\n"); } 
     | TOKEN_DECLARE set_value 
; 

set_value : TOKEN_SYMBOL TOKEN_SET { printf("Set var"); } 
     | set_value TOKEN_STR { printf(" to string\n"); } 
     | set_value TOKEN_SYMBOL { printf(" to symbol\n"); } 
; 

%% 

这里是我的Flex代码

%% 
[\t\n ] {/*Ignore*/} 

var { 
    return (TOKEN_DECLARE); 
} 

";" { 
    //puts("Got EOL"); 
    return (EOL); 
} 

\"[a-zA-Z]+\" { 
    return (TOKEN_STR); 
} 
\'[a-zA-Z]+\' { 
    return (TOKEN_STR); 
} 

[a-zA-Z]+ { 
    return (TOKEN_SYMBOL); 
} 

"=" { 
    return (TOKEN_SET); 
} 
%% 

感谢

回答

0

你的yacc代码只接受一个声明 - 该EOL唯一有效的后令牌是$end(文件/输入的结尾),所以在第二行中会出现语法错误。此外,规则statement: statment是无用的,永远不能减少(你应该从yacc得到关于它的错误消息)。

你想要的是用于匹配多个语句明确的规则:

statements: statements statement 
      | statement 
; 

这是第一个(启动)规则。那么你的陈述规则只是:

statement: declare_var EOL { puts("Reach declare EOL branch"); } 
     | set_value EOL { puts("Reach set_value EOL branch"); } 
; 
+0

谢谢,它的工作原理! – shockwave

相关问题