我最近下載了一個名爲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嗎?
嘗試運行「bison file.y」。或者「yacc file.y」。這將創建y.tab.c.您可以在Makefile中將y.tab.c添加到您的CFILES中。 –