私はPLY (python implementation of yacc)というかなり単純な文法を書こうとしています。私が望むときにトークンの文字列を減らすためにyacc
を得るのに問題があります。yaccが減らすことができません(Python Lex-Yacc)
さまざまな種類の引数を取る一連のコマンドを解釈したいと考えています。異なる種類の引数にはそれぞれ異なるトークンがあります。私はyacc
がinstruction
と呼ばれるルールにこれらの行のそれぞれを減らしたい
COMMAND VARARG VARARG STRARG
COMMAND VARARG STRARG STRARG
:lex
から出てきたトークンの文字列は次のようになります。ただし、yacc
は、最後の引数(STRARG
)の後に最初の行を減らすのを拒否し、予期しないCOMMAND
トークンのために構文エラーを生成します。代わりに(読まれていないはずの次の行から最後COMMAND
を拾う)COMMAND VARARG VARARG STRARG COMMAND
を取得するにはCOMMAND VARARG VARARG STRARG
yacc
、instruction
に移行する1つのより多くの時間を短縮することで、ある
。
私のコードのyacc
部分は次のようになります。
def p_rule1(p):
r'instruction : COMMAND VARARG VARARG STRARG'
# do stuff
def p_rule2(p):
r'instruction : COMMAND VARARG STRARG STRARG'
# do other stuff
は、私は私のルールの仕様にいくつかの明白な誤りがいるのでしょうか? lex
/yacc
を初めて使用したので、私は驚かないでしょう。
を参照してください。私はこれがまだ 'instruction'に何も減らさないので、' instructions'ルールはスタックに 'instruction'を見ることはないと考えています。 (新しいルールで)デバッグをオンにすると、スタックの進行状況は 'COMMAND' - >' COMMAND VARARG' - > 'COMMAND VARARG VARARG' - >' COMMAND VARARG VARARG STRARG' - > 'COMMAND VARARG VARARG STRARG COMMAND 'のようになります。 '(余分な' COMMAND'のためにここでは失敗します)。 'yacc'は最後の' COMMAND'をシフトする前に 'COMMAND VARARG VARARG STRARG'を' instruction'に減らしてはいけませんか? – Ael
また、PLYで 'instructions'ルールを実装した方法は次のとおりです: ' def p_instructions(p):r '' 'instructions:instructions'命令 '' 'パス' – Ael