[英]lex (flex) generated program not parsing whole input
我有一個相對簡單的lex / flex文件,並已使用flex的debug標志運行該文件,以確保其正確分詞。 不幸的是,我總是遇到兩個問題之一-flex生成的程序停止運行只是在經過幾個標記后才默默放棄,或者沒有調用我用來識別字符和字符串的規則,而默認規則被稱為。
有人可以指出我正確的方向嗎? 我已經附加了我的flex文件和示例輸入/輸出。
編輯:我發現生成的詞法分析器在特定規則“ cdr”后停止。 這更詳細,但也更加令人困惑。 我已經發布了一個簡短的修改過的lex文件。
/* lex file*/
%option noyywrap
%option nodefault
%{
enum tokens{
CDR,
CHARACTER,
SET
};
%}
%%
"cdr" { return CDR; }
"set" { return SET; }
[ \t\r\n] /*Nothing*/
[a-zA-Z0-9\\!@#$%^&*()\-_+=~`:;"'?<>,\.] { return CHARACTER; }
%%
輸入樣例:
set c cdra + cdr b + () ;
通過生成的解析器運行輸入的完整輸出:
--(end of buffer or a NUL)
--accepting rule at line 16 ("set")
--accepting rule at line 18 (" ")
--accepting rule at line 19 ("c")
--accepting rule at line 18 (" ")
--accepting rule at line 15 ("cdr")
有什么想法嗎? 輸入一半后,生成的程序就放棄了! (作為參考,我通過將文件內容重定向到生成的程序來進行輸入)。
生成獨立的詞法分析器(即不是使用bison / yacc中定義的標記的詞法分析器時),通常會在文件頂部寫一個枚舉來定義標記。但是,lex程序的主循環(包括主循環)默認情況下生成的循環看起來像這樣:
while( token = yylex() ){
...
這很好,直到您的詞法分析器匹配枚舉中最先出現的規則-在這種情況下為CDR。 由於默認情況下枚舉從零開始,因此這導致while循環結束。 重新編號您的枚舉-將解決此問題。
enum tokens{
CDR = 1,
CHARACTER,
SET
};
簡短版本:手動為詞法分析器定義標記時,以1而不是0開頭。
這個規則
[-+]?([0-9*\.?[0-9]+|[0-9]+\.)([Ee][-+]?[0-9]+)?
|
似乎在第一個0-9之后缺少右括號,我添加了| 低於我認為應該的位置。 我無法開始猜測flex將如何響應。
我通常用於符號名稱的規則是[a-zA-Z$_]
,就像您未引用的字符串一樣,只是我通常允許在符號內使用數字,只要符號不是以數字開頭。
[a-zA-Z$_]([a-zA-Z$_]|[0-9])*
字符只是一個簡短的符號。 我認為它不需要自己的規則,但是如果有,則需要確保字符串規則至少需要2個字符。
[a-zA-Z$_]([a-zA-Z$_]|[0-9])+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.