0

グラコを使用して単純な左再帰文法を記述しようとしていますが、うまくいきません。

右再帰は問題なく動作します:

symbol = /[a-z]/ ;
condition = symbol "AND" condition | symbol ;
start = condition $ ;

私が見つけたすべての例によると、左再帰は次のように説明する必要があります。

symbol = /[a-z]/ ;
condition = condition "AND" symbol | symbol ;
start = condition $ ;

ただし、以下のルールでは機能しません。

a AND b AND c

このエラーが発生します:

grako.exceptions.FailedParse: srecur(1:3) Expecting end of text. :
a AND b AND c
  ^
start

この時点で私が理解しているのは、ルールの最初の文字はではsymbolなく一致condition "AND" symbolするため、グラコはそれを使用したいと考えているということです。しかし、私の開始ルールは、すべてのキャラクターが消費されたことを強制します。

私はまだ多くの回避策を使用しようとしましたが、適切なものを見つけることができませんでした.

4

1 に答える 1

2

Grako は実際には PEG パーサーです。これらのパーサーには、左再帰を簡単に処理できないという暗黙の特性があります。

詳細あちこちで。

私のニーズのために、私はこの種の式で私の問題を解決することができました:

condition = symbol { "AND" symbol }* ;
于 2016-12-28T10:15:25.083 に答える