2017-06-14 53 views
0

解析語法時,是否應該使用RegEx來匹配可以表示爲常規語言的語法,還是應該使用當前的解析器設計?正則表達式應該在解析器中用於解釋器還是編譯器?

例如,對於JSON的EBNF語法可以被表示爲:

object ::= '{' '}' | '{' members '}'; 
members ::= pair | pair ',' members; 
pair ::= string ':' value; 
array ::= '[' ']' | '[' elements ']'; 
elements ::= value | value ',' elements; 
value ::= string | number | object | array | 'true' | 'false' | 'null'; 

所以語法將需要使用某種類型的詞法分析器(如遞歸下降語法分析器或特設解析器)進行匹配,但對於某些值(如數字)的語法可以被表示爲像數此正則表達式模式的正則語言:

-?\d+(\.\d+)?([eE][+-]?\d+)? 

鑑於這一例子中,假設正在產生遞歸下降JSON解析器..如果這個數字是匹配的d通過遞歸下降技術還是應該通過RegEx匹配號碼,因爲它可以使用RegEx輕鬆匹配?

+0

如果你有嵌套,我會用一個體面的解析器。各個組件可以使用正則表達式來概括字符(特別是類)。 – sln

回答

0

這是一個非常寬泛和有見地的問題。因此,就我所知,通常您會希望解析器儘可能快,並儘可能在內存中佔用最小的空間,特別是需要實時解析時(按需)。

RegEx肯定會完成這項工作,但它就像是用核武器射擊蒼蠅!

這就是爲什麼,很多解析器都寫在低層次的語言如C利用字符串的指針和避免因使用高級語言如Java與不變的領域,垃圾收集,開銷...

與此同時,這在很大程度上取決於您的用例,並且不能以通用方式真正回答。您應該考慮開發人員使用RegEx的便利性與解析器的性能之間的權衡。

一個額外的考慮因素是,通常你會希望解析器指出你有什麼語法錯誤,以及它是哪種類型的錯誤。使用正則表達式,它將無法匹配,您將很難找出爲什麼它停止以顯示正確的錯誤消息。使用老派解析器時,只要遇到語法錯誤,您就可以快速停止解析,並且您可以準確知道哪些內容與哪些內容不匹配,以及在哪裏。

在您的JSON解析和使用RegEx僅用於數字的特定情況下,我想您可能已經在使用高級語言了,因此許多實現所做的工作就是依賴語言本地語法分析數字。因此,只需使用分隔符選擇值(字符串,數字...),並讓編程語言爲數字解析引發異常。