2017-04-11 45 views
0

我想了解過去2天的Ragel,並且一直面臨着與Ragel語法相關的一些問題。我的目標是編寫一個解析器,以C++作爲宿主語言識別Regex命令。現在我想認識與分析器以下命令 - :LoadSdf [0-9]+使用Ragel和C++編譯錯誤

下面是下面的代碼我想:

#include <iostream> 
#include <string.h> 
#include <stdio.h> 

%%{ 
action done { 
printf("done\n"); 
} 

machine ldf;  
main := (':'.'LoadSdf'.[0-9])@done; 

}%% 

%%write data; 
int main(int argc, char** argv) 
{ 
int cs; 
if(argc > 1) { 
    char *p = argv[1]; 
    char *pe = p+strlen(p) + 1; 
    %%write init; 
    %%write exec; 
} 
return 0; 
} 

當我嘗試用命令ragel ldf.cpp編譯 - 我得到以下錯誤:

ldf.cpp:10:1: this specification has no name, nor does any previous specification 
ldf.cpp:16:31: action lookup of "done" failed 

但是,如果我寫的直接代碼

main := (':'.'LoadSdf'.[0-9])@{printf("done\n");} //this compiles. 

第二個問題我已經是當我嘗試寫我的狀態機如下 -

main := (':'.'LoadSdf'.[0-9])@{printf("done\n");} $err{printf("error : %c",fc);}; 

我想打印一個錯誤,當預期的命令不匹配。 上面的代碼用ragel命令編譯。 然而,當我嘗試用g++ ldf.c -o ldf編譯 - 這提供了以下編譯器錯誤:

ldf.c: In function ‘int main(int, char**)’: 
ldf.c:171:12: error: ‘eof’ was not declared in this scope 
if (p == eof) 
      ′   

任何建議都歡迎。

回答

1

machine應出現在第一行。這就是「這個規範沒有名字」的錯誤所在。

%%{ 

machine ldf; // put it here. 

action done { 
    printf("done\n"); 
} 

main := (':'.'LoadSdf'.[0-9])@done; 

}%% 

你的第二個錯誤,你應該定義eof變量。

char *p = argv[1]; 
char *pe = p+strlen(p) + 1; 
char *eof = pe;    // <-- add this.