簡體   English   中英

如何讓Ragel執行不同的動作進行解析

[英]How to get Ragel perform different actions for parsing

我是Ragel的新手,並一直在嘗試解析Regex表達的特定模式。 我希望找到匹配項時執行done動作,並且即使缺少任何單個字符也沒有匹配parse_error時要執行parse_error

這是我編寫的代碼:

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

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


action parse_error {
printf("error : %c\n",fc);
}


machine ldf;    
main := (':'.'LoadSdf'.[0-9]+.[a-zA-Z0-9_\-\.])@done |    //execute done
         (^(':'.'LoadSdf'.[0-9]+.[a-zA-Z0-9_\-\.])) $err(parse_error); //execute parse error for no match

}%%

%%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;
}

我看到的行為是,當regex表達式完全匹配時,將執行done動作和parse_error

誰能提供一些有關如何解決此問題的提示?

此代碼存在幾個問題。 首先,一個技術錯誤---您對pe定義一無所知(它包含零個字符,並且您的計算機不應該關心零(當然您可以使其處理零,但它只會使事情變得復雜)原因))。 定義eof也是有用的,因為當輸入中有諸如“:Load”之類的內容(缺少“ Sdf”及其后的代碼塊)時,它應該是錯誤的。 那是由固定的

-char *pe = p+strlen(p) + 1;
+char *pe = p+strlen(p);
+char *eof = pe;

另一個問題是,無需結合某些機器及其負面因素來控制錯誤。 這些是不同的動作。 看一下機器的圖片:

原始狀態機

您可以看到在中間沒有適當的錯誤處理,最后您可以多次調用done() ,因為它被指定為在過渡到最終狀態之一時發生。 可能只應在正確的機器加工條件下運行(即達到最終狀態的EOF)。

因此,如果要將機器定義更改為

main := (':'.'LoadSdf'.[0-9]+.[a-zA-Z0-9_\-\.]) %/done $!(parse_error);

您可能會得到想要的:

$ ./a.out "asdf"
error : a
$ ./a.out "qwerty"
error : q
$ ./a.out ":Load"
error : 
$ ./a.out ":LoadSdf"
error : 
$ ./a.out ":LoadSdf1212"
done
$ ./a.out ":LoadSdf1q"
done
$ ./a.out ":LoadSdf1qwe"
error : w

圖形形式如下所示:

固定狀態機

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM