2014-12-21 51 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

相關問題