雖然PLY有問題,但我嘗試在野牛中重寫相同的語法片段並遇到類似的問題。這表明我可能做錯了什麼。野牛匹配錯誤標記
語法片段的符號表示如下:
document -> fragment?
fragment -> { \n line* \n fragment? }
line -> [^\n]+ \n
相關法線:
[{}] return *yytext;
[^\n]+ return ANYTHING;
\n return EOL;
相關野牛行:
multiline: '{' EOL lines EOL multiline '}'
|
;
lines: lines ANYTHING EOL
|
;
語法是確定性的,儘管我知道甚至應該是LALR(1)(雖然沒有真正嘗試構建畫面)。像"{\n\n}"
這樣的文檔解析好,但multiline
元素嵌套的文檔(例如"{\n\n{\n\n}}"
)沒有,詞法分析器將最後一個"}}"
看作標記"ANYTHING"
而不是兩個'}'
s。
我在做什麼錯?
你試過'[^ {} \ n] + return ANYING;'? – wildplasser 2012-02-08 13:10:25
這是一個可行的方法,但將文本分隔爲「行」的原始思想是允許任何非EOL字符進入字段。 – mistotebe 2012-02-08 13:48:46
那麼會吃掉你所有的「{}」,不是嗎? Lex是貪婪的:如果兩個模式匹配當前輸入,最長匹配獲勝。 – wildplasser 2012-02-08 14:05:54