[英]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.