我想解析一個使用flex/bison具有某種「轉義序列」的語言。目前,我堅持定義詞法分析器。這是最簡單的例子來解釋:Flex:處理多字符註釋式分隔符
Text --> {if} test {literal} text 43.21 {if} foo {/literal} {if}
---- ---- --------- ------------------- ---------- ---- etc.
Desired --> IF TEXT (ignore) TEXT (ignore) IF
Token
正如你所看到的,語言包含了一些終端的符號,如IF
或TEXT
,這是相當直接的。 但是,{literal}
和{/literal}
之間的所有內容都是TEXT
,即使它包含的字符串本來會是特殊的標記。
我能想出一個詞法分析器的最佳到目前爲止是這樣的,它使用Start Conditions的不同狀態之間跳躍:如果遇到了一個{literal}
,它激活LITERAL
規則。
%{
#include <stdio.h>
#define YY_DECL int yylex()
%}
%x LITERAL
%%
[^{]+ {printf("TEXT: %s\n", yytext);}
"{if}" {printf("IF\n");}
"{literal}" {BEGIN(LITERAL);}
<LITERAL>[^{]+ {printf("TEXT: %s\n", yytext);}
<LITERAL>"{" {printf("TEXT: %s\n", yytext);}
<LITERAL>"{/literal}" {BEGIN(INITIAL);}
%%
main() {yylex();}
但是如何離開LITERAL
狀態?利用該定義與上面的實施例給出
IF
TEXT: test
TEXT: text 43.21
TEXT: {
TEXT: if} foo
IF
換句話說,在{literal}
標記內的TEXT
令牌在{
被分割。我怎樣才能避免這種情況?
您應該怎樣代碼處理字符串'{}字面「{/ literal}」{/ literal}'; ''''''''''''''/'''''''''''在某種程度上,這是不重要的(您所顯示的語言中沒有引用字符串)。但你需要知道答案。 –
@JonathanLeffler:結束標籤沒有開始標籤將是一個語法錯誤。 – Geier
好的:我認爲你的問題將是一個沒有接近引用的開盤報價,但我明白你的意思。我正在查看代碼,以瞭解我如何處理此類評論。答案是「它變化」,這取決於我需要做什麼'評論' - 我經常刪除它。所以我不確定我有一個好的答案,也不知道'yymore()'是否相關。 –