我的輸入由一系列名稱組成,每個名稱都在一個新行上。每個名字都包含一個名字、可選的中間名首字母和姓氏。名稱欄位由制表符分隔。這是一個示例輸入:
Sally M. Smith
Tom V. Jones
John Doe
以下是我的 Flex 詞法分析器的規則。它作業正常,但我擔心我的詞法分析器做得太多:它正在確定令牌是名字、中間名首字母或姓氏。這個決定應該在決議器中完成,而不是在詞法分析器中完成?我是否在濫用 Flex 狀態功能?我正在尋求的是對我的詞法分析器的批評。我只是一個初學者,決議專家如何為這個輸入創建詞法分析器規則?
<INITIAL>{
[a-zA-Z] { yylval.strval = strdup(yytext); return(FIRSTNAME); }
\t { BEGIN MI_STATE; }
. { BEGIN JUNK_STATE; }
}
<MI_STATE>{
[A-Z]\. { yylval.strval = strdup(yytext); return(MI); }
\t { BEGIN LASTNAME_STATE; }
. { BEGIN JUNK_STATE; }
}
<LASTNAME_STATE>{
[a-zA-Z] { yylval.strval = strdup(yytext); return(LASTNAME); }
\n { BEGIN INITIAL; return EOL; }
. { BEGIN JUNK_STATE; }
}
<JUNK_STATE>. { printf("JUNK: %s\n", yytext); }
uj5u.com熱心網友回復:
您可以像在此問題中一樣使用詞法分析器狀態。但最好將它們用作有條件激活規則的手段。例如,考慮處理多行注釋或此處的檔案或(對我們銀背而言)嵌入式 SQL。
在您的問題中,給定名稱和姓氏之間沒有詞匯差異——[a-zA-Z] 如果您要擴展詞法分析器,它們都與 匹配,中間名也是如此。
簡短回答:是的,lex NAME 標記并讓決議器確定您是否在一行中有三個 NAME 標記。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/364379.html
標籤:解析 野牛 flex-lexer 雅克 莱克斯
上一篇:帶逗號重復的EBNF
下一篇:用設定的字串替換檔案中的固定位置
