2013-09-29 65 views
0

使用下面的flexbison代码,我可以打印文本hello当命令print "Hello"输入:野牛多行语法

flex file:

%{ 
#include <iostream> 
using namespace std; 
#define YY_DECL extern "C" int yylex() 
#include "gbison.tab.h" 
%} 
%% 
[ \t\n]   ; 
[a-zA-Z0-9]+  { yylval.sval = strdup(yytext); return STRING; } 
\"(\\.|[^"])*\" { yylval.sval = strdup(yytext); return QUOTED_STRING; } 
%% 

bison file:

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

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

void yyerror (const char* s); 
%} 

%union { 
    char* sval; 
} 

%token <sval> STRING 
%token <sval> QUOTED_STRING 
%% 

str: 
    STRING QUOTED_STRING 
    { 
     if (strcmp($1, "print") == 0) 
     { 
      cout << $2 << flush; 
     } 
     if (strcmp($1, "println") == 0) 
     { 
      cout << $3 << endl; 
     } 
    } 
    ; 
%% 

main(int argc, char* argv[]) 
{ 
    FILE* input = fopen(argv[1], "r"); 
    if (!input) 
    { 
     cout << "Bad input. Nonexistant file" << endl; 
     return -1; 
    } 

    yyin = input; 

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

} 
void yyerror(const char* s) 
{ 
    cout << "Error. " << s << endl; 
    exit(-1); 
} 

如何我会改变Bison grammar以便它会如果有多个print或println命令,没有语法错误

+0

请注意标注的... Flex是用于Adobe/Apache的UI框架。 Flex-lexer用于词法分析器。 – JeffryHouser

+0

@ Reboog711明白了。没有意识到'flex'是用于Adobe/Apache Flex的,而不是'flex-lexer' – inixsoftware

回答

1

添加到语法第一%%前行:

%start list 

,并添加到语法只是第%%行之后:

list: 
     /* Nothing */ 
    | list str 
    ; 

这是说完整的语法由列表中,而且一个列表没有任何内容(空输入)或一个列表,后跟一个'str'。

原样,你的语法说,有效输入包括恰好一次发生“STR”的,因此,语法错误,当你开始重复自己。