我做了一些搜索,沒有找到「直接」回答這個問題的問題。什麼語法糖或語言功能使語言難以解析?
無論如何,這個問題的基本要點是我想知道什麼「語言功能」或「語法」,使語言成爲一個主要的痛苦,建立一個解析器,語法高亮等?
這可能是主觀的,但我想像解析一個語言的差異,比如說像Lisp這樣的語言,例如它的(func parms etc ..)結構,而不是像C++和所有模板一樣,括號等等。
我做了一些搜索,沒有找到「直接」回答這個問題的問題。什麼語法糖或語言功能使語言難以解析?
無論如何,這個問題的基本要點是我想知道什麼「語言功能」或「語法」,使語言成爲一個主要的痛苦,建立一個解析器,語法高亮等?
這可能是主觀的,但我想像解析一個語言的差異,比如說像Lisp這樣的語言,例如它的(func parms etc ..)結構,而不是像C++和所有模板一樣,括號等等。
通過宏或其他方式支持語法擴展的語言無法完全解析,除非您可以正確展開宏。對於具有完整程序宏的語言(如Lisp或Curl),如果不實現語言本身,則無法完全解析!
通常爲了這些語言的語法高亮目的,您不要嘗試擴展宏並假定宏遵循常規語言習語。
從形式langugaes和語法的角度來看,有兩個主要方面恕我直言。首先,語言的語法應該屬於一些易於處理的類別。例如具有上下文無關語法的語言,這意味着例如你的語言也有太多的元素,它們的數量取決於對方,例如打開和關閉的括號,可能需要解析無限量的內存。 C++有上下文敏感的語法,甚至更糟糕,例如可能是具有相互依賴的三個元素的語法。另一個方面是解析時的歧義。在模棱兩可的語法中,您可以用不同的方式解析相同的文本,這意味着您必須爲您的解析算法找到正確的方法 - 其中大部分都不允許含糊不清。
我不完全確定,但我會說,解析括號和空格(當合理定義時)同樣複雜。對於這兩種情況,您都需要一個計數器來檢查塊嵌套的級別,但是使用空格可以在本地標識級別(通過計算空格),並且您可以確定,計數器不會低於零,這可能會發生在您有更多的右括號比開放。
啊,這是有道理的!我從來沒有想過支持/解析可以自行擴展自己的語法的語言的問題,這確實是一個棘手的問題。然而,我還想知道一些「更普通」的語法,比如Python的空白區域和C的支架樣式?這將如何影響解析? – Pharaun 2010-05-18 18:57:32