我們正在研究縮減Make語法的語法,並遇到了嵌套擴展的問題。解析使用pyparsing進行擴展
下面是我們要解析的內容示例:
$(error Not implemented for this OS: $(filter XYZ_OS_%, $(.VARIABLES)))
這是嵌套表達問題的變體,很多人看起來與奮鬥。這有點困難,因爲嵌套表達式可以包含自由形式的字符串,包括括號和美元:($
字符與重複此轉義)
$(error Something went wrong (you owe me $$$$$$.))
我對此有一個初步的語法,但我想不出一種定義text
規則的方法。
name = Word(alphanums + '_')
text = CharsNotIn('$)') # This does not work generally.
expansion = Suppress('$(') + name + Suppress(')')
sub_expression = Forward()
expression = ZeroOrMore(sub_expression)
error = Suppress('$(error ') + expression + Suppress(')')
info = Suppress('$(info ') + expression + Suppress(')')
pattern = Word(alphanums + '._%')
filter = Suppress('$(filter ') + pattern + Suppress(',') + expression + Suppress(')')
sub_expression << (text | error | filter | info | expansion)
# This accepts all kinds of invalid Make syntax,
# but is useful for testing line-by-line.
test_grammar = OneOrMore(text | expansion | error | filter | info)
這捕獲了天真的情況,但括號和美元不屬於擴展失敗。
任何想法?謝謝!
我想你應該像處理一般變量擴展一樣處理'error','filter'等等。 –
@Antti,謝謝,我想我們剛剛得出同樣的結論。不幸的是,它似乎沒有幫助將文本內容與擴展分開。 –
這就是爲什麼它是一個評論...你應該知道Make是如何首先解析擴展,然後複製它,最簡單的方法。 –