expr = Ref('expr')
block = '{' + Repeat(expr) + '}'
expr = block | Token(re='[0-9]')
START = expr
lrparsing
これは Python 用のモジュールを使用した文法です。モジュールは、文法の競合を報告しません。
{{0}}
エラー
で文字列を解析できませんlrparsing.ParseError: line 1 column 5: Got '}' when expecting __end_of_input__ while trying to match block in state 11
段階的なスタック状態は次のとおりです。
shift '{'; ItemSet:5='{'
shift '{'; ItemSet:5='{' ItemSet:5='{'
shift /[0-9]/; ItemSet:4=/[0-9]/ ItemSet:5='{' ItemSet:5='{'
reduce '}'; ItemSet:4=/[0-9]/ -- ItemSet:7=expr ItemSet:5='{' ItemSet:5='{'
reduce '}'; ItemSet:7=expr -- ItemSet:9=expr ItemSet:5='{' ItemSet:5='{'
shift '}'; ItemSet:11='}' ItemSet:9=expr ItemSet:5='{' ItemSet:5='{'
これは、それがシフトしていることを意味し、次に に減少するの{{0
を見て、最初にシフトせずに再び減少するため、バジーザスが混乱します。}
0
expr
}
これはバグですか、それとも私は非常に単純で愚かなことをしていますか?
それが私の文法である場合、どうすればそれをリファクタリングして、私の永遠の熱狂的で情熱的な欲求を満たすことができるでしょうか? それがバグである場合、誰かが動作する lrparsing に最も似た構文を持つ python モジュールに私を導くことができますか?
編集:次のようにリファクタリング:
blocks = Ref('blocks')
block = Ref('block')
expr = Ref('expr')
blocks = blocks + block | THIS*0 # THIS*0 is the idiomatic way of getting the empty string
block = '{' + expr + '}'
expr = blocks | Token(re='[0-9]')
START = expr
適切な解析を可能にします。今の私への質問は...なぜですか?lrparsing
解析の問題について以前に私に不平を言ったような気がします...Repeat
単に期待どおりに機能しないのですか?