2013-02-25 35 views
1

我工作的一個簡單的編程語言設計一個詞法和語法分析器。這裏是我的flex .l文件:爲什麼編譯我的野牛文件時會出現如此多的警告?

%{ 
#include <cstdio> 
#include <stdio.h> 
#include <iostream> 
#include <stdlib.h> 
using namespace std; 
#define YY_DECL extern "C" int yylex() 
#include "littleDuck.tab.h" 
int line_num = 1; 
%} 
id  [a-zA-Z][a-zA-Z0-9]* 
cteI [0-9]+ 
not  (<)(>) 
cteF {cteI}(\.{cteI}((e|E)("+"|"-")?{cteI})?)? 
ctestring (\".*\") 

%% 

[ \t] ; 
program {return PROGRAM;} 
var  {return VAR;} 
print {return PRINT;} 
"else" {return ELSE;} 
"if" {return IF;} 
{id} {return ID;} 
\=  {return '=';} 
\<  {return '<';} 
\>  {return '>';} 
{not} {return NOT;} 
\+  {return '+';} 
\-  {return '-';} 
\/  {return '/';} 
\*  {return '*';} 
\:  {return ':';} 
\,  {return ',';} 
\;  {return ';';} 
\{  {return '{';} 
\}  {return '}';} 
\(  {return '(';} 
\)  {return ')';} 
{cteI} {yylval.ival = atoi(yytext); return INT;} 
{cteF} {yylval.fval = atof(yytext); return FLOAT;} 
{ctestring} {yylval.sval = strdup(yytext); return STRING;} 
\n  {++line_num;} 
.  ; 

%% 

此文件正在由flex正確編譯,雖然我不完全確定是否可以總結一些術語。編譯我的野牛文件時出現真正的問題。我從Ubuntu終端輸入以下內容:

[email protected]:~/Lenguajes/flexBison$ bison -d littleDuck.y 

它返回22個非終結符在語法中無用,41個規則在語法中無用。我的野牛檔案是下一個:

%{ 
#include <cstdio> 
#include <iostream> 
using namespace std; 

extern "C" int yylex(); 
extern "C" int yyparse(); 
extern "C" FILE *yyin; 
extern int line_num; 

void yyerror(const char *s); 
%} 

%union{ 
    int ival; 
    float fval; 
    char *sval; 
} 

%token ID NOT PROGRAM VAR PRINT IF ELSE 

%token <ival> INT 
%token <fval> FLOAT 
%token <sval> STRING 


%% 
programa: 
    PROGRAM ID ':' vars_1 
    ; 
vars_1: 
    VAR 
    ; 
vars: 
    VAR ID id_1 
    ; 
id_1: 
    ',' id_1 
    | ':' tipo tipo_1 
    ; 
tipo: 
    INT 
    | FLOAT 
    ; 
tipo_1: 
    /* empty */ 
    ID id_1 
    ; 
bloque: 
    '{' e1 
    ; 
e1: 
    estatuto e2 
    | e2 
    ; 
e2: 
    estatuto e2 
    | '}' 
    ; 
estatuto: 
    asignacion 
    | condicion 
    | escritura 
    ; 
asignacion: 
    ID '=' expresion ';' 
    ; 
expresion: 
    exp exp_1 
    ; 
exp: 
    termino exp_2 
    ; 
exp_1: 
    /* empty */ 
    | '>' exp 
    | '<' exp 
    |NOT exp 
    ; 
exp_2: 
    '+' exp 
    | '-' exp 
    ; 
escritura: 
    PRINT '(' esc_1 
    ; 
esc_1: 
    expresion esc_2 
    | STRING esc_2 
    ; 
esc_2: 
    ',' esc_1 
    | ')' ';' 
    ; 
condicion: 
    IF '(' expresion ')' bloque cond 
    ; 
cond: 
    ';' 
    | ELSE bloque ';' 
    ; 
termino: 
    factor term 
    ; 
term: 
    '*' termino 
    | '/' termino 
    ; 
var_cte: 
    ID 
    | INT 
    | FLOAT 
    ; 
factor: 
    '(' expresion ')' 
    | var_cte 
    | '+' var_cte 
    | '-' var_cte 
    ; 

%% 
main() { 
    FILE *myfile = fopen("testFile", "r"); 
    if (!myfile) { 
     cout << "I can't open file" << endl; 
     return -1; 
    } 
    yyin = myfile; 

    do { 
     yyparse(); 
    } while (!feof(yyin)); 

} 

void yyerror(const char *s) { 
    cout << "Yikes! Parse error on line " << line_num << "! Message: " << s << endl; 
    exit(-1); 
} 

爲什麼警告正在產生,我該如何擺脫它們?對不起,發佈完整的程序,但我認爲所有的信息是重要的,因爲柔性文件顯示正在產生什麼令牌和野牛文件擁有所有的語法規則。

+2

可能有助於顯示一些錯誤 – 2013-02-25 04:16:15

+0

littleDuck.y的語言:警告:22個非終結符在語法中無用 littleDuck.y:警告:41條規則在語法中無用 littleDuck.y:34.1-4:警告:非終結符在語法中無用:vars littleDuck.y:35.16-19:警告:非終結符無用語法:ID_1 littleDuck.y:39.15-18:警告:非終結無用的語法:TIPO 這些都是一些錯誤的。幾乎所有這些都是一樣的,每次都在變化。 – gabrielbaca 2013-02-25 04:35:01

+0

如果它們無用,請將其刪除。如果你真的需要使用它們,那麼你的語法就有錯誤。 – leppie 2013-02-25 04:49:20

回答

1

你的語法基本上只是:

programa: 
    PROGRAM ID ':' vars_1 
    ; 
vars_1: 
    VAR 
    ; 

這意味着,唯一有效的方案,將接受是

program id : var 

其中id可能是任何有效的標識符。其他任何將是一個語法錯誤。

所有的規則,其餘的都是不可達的和無用的,因爲沒有辦法從programa達到這些目標。所以野牛告訴你,你可能只是刪除它們。

你可能想要的是添加一些其他的programavars_1規則導致的其他規則,以實際解析你想

-1

一些語法的確是不正確或丟失的符號。我重寫了我的語法,並且它正確地工作,只是指出有3次移位減少。我加了左結合到令牌做了下:

%left '*' '/' 
%left '+' '-' 

而且我沒加令牌保留字「Int」和「浮動」,只是有那些int和float常數。這顯然是一個巨大的問題,因爲我無法聲明任何變量。我添加了它們並用FLOATC和INTC替換了常量的標記。這被添加到詞法文件和語法文件中。

相關問題