PLY を使用して自分の言語用のパーサーを構築してきましたが、shift/reduce の競合が発生して問題が発生しています。私の言語には、構文 ala C++ テンプレートを持つジェネリック型があります。だから今、私は次のようなルールを持っています:
expression : expression LESS expression %prec COMPARISON
expression : template
template : NAME
| NAME LESS templates GREATER
templates : template
| templates COMMA template
ただし、解析できないことがわかりました。
a < 2
(これは明らかな理由で問題です)。デバッグ出力は次のとおりです。
PLY: PARSE DEBUG START
State : 0
Stack : . <Token: 'NAME' 'a'>
Action : Shift and goto state 42
State : 42
Stack : NAME . <Token: 'LESS' '<'>
Action : Shift and goto state 81
State : 81
Stack : NAME LESS . <Token: 'NUMBER' '2'>
ERROR: Error : NAME LESS . <Token: 'NUMBER' '2'>
さらにパーサーが必要な場合は、提供できます。ありがとう。
編集:私に提案された1つの解決策は、型を独自のトークンにすることでした。私の言語は C/C++ のようなプリプロセッサ インクルード システムを使用していないため、これには少し作業が必要になりますが、それでも可能だと思いますが、文法に制限されたソリューションを希望します。