ファイル内のパスを解析する文法を PLY で書こうとしています。シフト削減の競合が発生していますが、文法を変更して修正する方法がわかりません。解析しようとしているファイルの例を次に示します。パス/ファイル名は、受け入れ可能な任意の Linux パスにすることができます。
file : ../../dir/filename.txt
file : filename.txt
file : filename
だからここに私が書いた文法があります。
header : ID COLON path
path : pathexpr filename
pathexpr : PERIOD PERIOD DIVIDE pathexpr
| PERIOD DIVIDE pathexpr
| ID DIVIDE pathexpr
|
filename : ID PERIOD ID
| ID
これが私のトークンです。PLY に含まれる ctokens ライブラリを使用しています。自分で書く手間を省くためです。
t_ID = r'[A-Za-z_][A-Za-z0-9_]*'
t_PERIOD = r'\.'
t_DIVIDE = r'/'
t_COLON = r':'
したがって、パーサーはトークンを「ID」に減らすか、「ID PERIOD ID」にシフトするかがわからないため、「ファイル名」ルールにシフト削減の競合があると思います。パス(「ファイル名」)がない場合、空に減らす代わりにpathexprでトークンを消費する別の問題があると思います。
これらのケースを処理するために文法を修正するにはどうすればよいですか? たぶん、トークンを変更する必要がありますか?