382
18313
我目前正在為XML風格編寫基本的解析器。作為練習,我將實現一個LL表驅動的解析器。
這是我的BNF語法示例:
%令牌名稱數據字符串
%% / * LL(1)* /
doc:elem
元素:“ <” open_tag
open_tag:名稱attr close_tag
close_tag:“>” elem_or_data“ ”
| “ />”
;
elem_or_data:“ <” open_tag elem_or_data
|數據elem_or_data
| / * epsilon * /
;
attr:名稱“:”字符串attr
| / * epsilon * /
;
這個語法正確嗎?
每個終端文字都在引號之間。抽象終端由%token指定。
我正在編寫一個手寫詞法分析器,以將輸入內容轉換為令牌列表。我將如何標記抽象終端? 
經典方法是為每個可能的終端編寫一個正則表達式(或其他識別器)。
所謂的“抽象”終端,實際上是非常具體的終端,其關聯的模式可以識別多個可能的輸入字符串。實際識別的字符串(或該字符串的某些計算函數)應作為標記的語義值傳遞給解析器。
名義上,在輸入字符串的每個點上,令牌生成器將運行所有識別器,並選擇匹配時間最長的識別器。 (這是所謂的“最大嚼數”規則。)通常可以對其進行優化,尤其是在所有模式都是正則表達式的情況下。例如,(F)lex將為您進行優化。
您的情況的複雜之處在於,語言的標記化取決於上下文。特別是,當目標是elem_or_data時,唯一可能的標記是<,