2013-11-27 85 views
0

我最近下載了一個名爲re1(Goggle)的開源項目,因爲我目前的研究主題是關於與nfa和dfa匹配的正則表達式。 re1是一個非常非常簡單和小型的項目,但有一個parse.y文件,但我從未見過。谷歌後,我知道它是由yacc(另一個編譯器編譯器)生成的。還有一個makefile,所以我可以在Linux中運行它,但現在我想在Visual Studio(Windows)中運行它,因爲我需要逐步調試(F5,F10,F11等非常有用)。但現在它不能在VS中生成,因爲VS無法識別它的.y文件,有很多「錯誤LNK2019:無法解析的外部符號」。 我不知道如何解決它,我可以轉換或恢復到.c文件嗎?怎麼做?yacc生成的.y文件如何恢復.c文件?

以下是parse.y的一部分:

%{ 
#include "regexp.h" 

static int yylex(void); 
static void yyerror(char*); 
static Regexp *parsed_regexp; 
static int nparen; 

%} 

%union { 
    Regexp *re; 
    int c; 
    int nparen; 
} 

%token <c> CHAR EOL 
%type <re> alt concat repeat single line 
%type <nparen> count 

%% 

line: alt EOL 
    { 
     parsed_regexp = $1; 
     return 1; 
    } 

alt: 
    concat 
| alt '|' concat 
    { 
     $$ = reg(Alt, $1, $3); 
    } 
; 

concat: 
    repeat 
| concat repeat 
    { 
     $$ = reg(Cat, $1, $2); 
    } 
; 

repeat: 
    single 
| single '*' 
    { 
     $$ = reg(Star, $1, nil); 
    } 
| single '*' '?' 
    { 
     $$ = reg(Star, $1, nil); 
     $$->n = 1; 
    } 
| single '+' 
    { 
     $$ = reg(Plus, $1, nil); 
    } 
| single '+' '?' 
    { 
     $$ = reg(Plus, $1, nil); 
     $$->n = 1; 
    } 
| single '?' 
    { 
     $$ = reg(Quest, $1, nil); 
    } 
| single '?' '?' 
    { 
     $$ = reg(Quest, $1, nil); 
     $$->n = 1; 
    } 
; 

count: 
    { 
     $$ = ++nparen; 
    } 
; 

single: 
    '(' count alt ')' 
    { 
     $$ = reg(Paren, $3, nil); 
     $$->n = $2; 
    } 
| '(' '?' ':' alt ')' 
    { 
     $$ = $4; 
    } 
| CHAR 
    { 
     $$ = reg(Lit, nil, nil); 
     $$->ch = $1; 
    } 
| '.' 
    { 
     $$ = reg(Dot, nil, nil); 
    } 
; 

%% 

static char *input; 
static Regexp *parsed_regexp; 
static int nparen; 
int gen; 

static int 
yylex(void) 
{ 
    int c; 

    if(input == NULL || *input == 0) 
     return EOL; 
    c = *input++; 
    if(strchr("|*+?():.", c)) 
     return c; 
    yylval.c = c; 
    return CHAR; 
} 

void 
fatal(char *fmt, ...) 
{ 
    va_list arg; 

    va_start(arg, fmt); 
    fprintf(stderr, "fatal error: "); 
    vfprintf(stderr, fmt, arg); 
    fprintf(stderr, "\n"); 
    va_end(arg); 
    exit(2); 
} 

static void 
yyerror(char *s) 
{ 
    fatal("%s", s); 
} 


Regexp* 
parse(char *s) 
{ 
    Regexp *r, *dotstar; 

    input = s; 
    parsed_regexp = nil; 
    nparen = 0; 
    if(yyparse() != 1) 
     yyerror("did not parse"); 
    if(parsed_regexp == nil) 
     yyerror("parser nil"); 

    r = reg(Paren, parsed_regexp, nil); // $0 parens 
    dotstar = reg(Star, reg(Dot, nil, nil), nil); 
    dotstar->n = 1; // non-greedy 
    return reg(Cat, dotstar, r); 
} 

我嘗試刪除這些符號如%,令牌和類型,但我不知道如何解決規則(%%),當然它不起作用,VS我怎麼辦,VS支持yacc嗎?

+0

嘗試運行「bison file.y」。或者「yacc file.y」。這將創建y.tab.c.您可以在Makefile中將y.tab.c添加到您的CFILES中。 –

回答

0

有兩種工具結合在一起。

Flex和Bison,GNU團隊「Lex和Yacc」。

有一本叫做「Flex and Bison」的書,另外一本叫做Lex和Yacc,他們真的很值得閱讀,你可以在幾分鐘之內拿到它們。

Flex和Bison是我所知道的兩個最被低估的東西。不斷重新實施。

瞭解已經發生的工作非常重要。不要嘗試讀取Flex的輸出,這是一個由程序創建的優化結果,不適合人類使用!當你知道它的功能時,請閱讀Flex的源代碼。

GPL許可證給你一個閱讀它的源代碼的權利。享受它:)

順便說一句Unix的東西,UNIX的哲學,告訴我們編寫程序,爲我們編寫其他程序,以可讀的文本進行交談,只做一項工作和一項工作,但做得很好。

Flex和Bison是這方面的主要例子。

另一個着名的雷蒙德引用:「爲未來做準備,因爲它會比你想象的更早」,兩者都仍然在這裏,而且還是非常好的。

0

而不是Yacc的,尋找野牛,這是GNU自由執行舊的Yacc程序。 yacc/Bison不會生成parse.y文件,但它是它的輸入文件。

一些類Unix和類Unix系統,比如一些Linux發行版,已經安裝了Bison。在Windows上,您必須單獨下載並安裝它們。您可以下載並安裝Bison for Windows

然後運行帶有.y文件的Bison作爲輸入。它生成一個C文件,然後您可以在Visual Studio中進行編譯。

+0

這就是我的答案,應該作爲對此的評論閱讀。 (太長了) –