目錄
解析表達式語法
編輯在計算機科學中,解析表達式語法(PEG)是一種分析形式語法,即它用一套識別語言中的字符串的規則來描述一種形式語言。這種形式主義是由BryanFord在2004年提出的,與1970年代初提出的自上而下的解析語言家族密切相關。從語法上看,PEG也與無語境語法(CFG)相似,但它們有不同的解釋:選擇運算符在PEG中選擇xxx個匹配,而在CFG中是模糊的。這更接近于實踐中的字符串識別方式,例如由遞歸下降分析器完成。與CFG不同的是,PEG不能是模棱兩可的;如果一個字符串可以解析,它就有一個有效的解析樹。據猜測,存在著不能被PEG識別的無語境語言,但這一點尚未被證明。PEG非常適合解析計算機語言(和人工人類語言,如Lojban),但不適合解析自然語言,因為PEG算法的性能與一般的CFG算法(如Earley算法)相當。
解析表達式語法的定義
編輯解析表達式語法的語法
從形式上看,一個解析表達式語法由以下部分組成。一個由非終端符號組成的有限集合N;一個由終端符號組成的有限集合Σ,該集合與N不相連;一個由解析規則組成的有限集合P;一個表達式eS,稱為起始表達式;P中的每個解析規則都有A←e的形式,其中A是一個非終端符號,e是一個解析表達。解析表達式是一個類似于正則表達式的分層表達式,它的構造方式如下。一個原子解析表達式包括:任何終端符號、任何非終端符號或空字符串ε。給定任何現有的解析表達式e、e1和e2,可以使用以下運算符構建一個新的解析表達式:序列:e1e2有序選擇:e1/e2零或多:e*一或多:e+可選:e?和-謂語:&e不-謂語:!e語義上下文自由語法和解析表達式語法的根本區別在于,PEG的選擇運算符是有序的。如果xxx個選擇成功了,第二個選擇就會被忽略。因此,有序選擇不是換元的,與無語境語法中的無序選擇不同。有序選擇類似于某些邏輯編程語言中的軟切割運算符。其結果是,如果CFG被直接翻譯成PEG,那么前者的任何歧義都可以通過從可能的解析中確定地挑選一個解析樹來解決。通過仔細選擇指定語法選項的順序,程序員對選擇哪種解析樹有很大的控制權。像布爾上下文自由語法一樣,解析表達式語法也增加了and-和not-的句法謂詞。因為它們可以使用任意復雜的子表達式來提前查看輸入字符串,而不實際消耗它,所以它們提供了強大的句法提前查看和消歧義設施,特別是當重新排序的替代物不能指定所需的確切解析樹時。解析表達式的操作解釋解析表達式語法中的每個非終端基本上都代表遞歸解析器中的一個解析函數,而相應的解析表達式則代表構成該函數的代碼。每個解析函數在概念上以一個輸入字符串為參數,并產生以下結果之一。成功,在這種情況下,函數可以選擇向前移動或消耗提供給它的輸入字符串中的一個或多個字符,或者失敗,在這種情況下不消耗任何輸入。
如果輸入字符串的xxx個字符與一個終端(即字面意思)相匹配,則由一個原子解析表達式成功,在這種情況下消耗輸入字符;否則表達式產生一個失敗結果。由空字符串組成的原子解析表達式總是在不消耗任何輸入的情況下成功。由非終端A組成的原子解析表達式表示對非終端函數A的遞歸調用。非終端可以在不消耗任何輸入的情況下成功,這被認為是不同于失敗的結果。序列運算符e1e2首先調用e1,如果e1成功,隨后對e1未消耗的輸入字符串的剩余部分調用e2,并返回結果。如果e1或e2失敗,那么序列表達式e1e2失敗(不消耗輸入)。選擇運算符e1/e2首先調用e1,如果e1成功,立即返回其結果。否則,如果e1失敗了,那么選擇運算符回溯到它調用e1的原始輸入位置,但隨后調用e2,返回e2的結果。零或多、一或多和可選運算符分別消耗其子表達式e的零或多、一或多、零或一的連續重復。
內容由匿名用戶提供,本內容不代表www.gelinmeiz.com立場,內容投訴舉報請聯系www.gelinmeiz.com客服。如若轉載,請注明出處:http://www.gelinmeiz.com/164027/