簡體   English   中英

lex(flex)生成的程序無法解析整個輸入

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

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