0

ドキュメントで説明されているこの種の文法があります。

grammar
    =
    | ['()'] ['$'] {'#' &'#'} '#'
    | ['()'] {'#' &'#'} '#%'
    | ['()'] ['$'] {'0' &'0'} '0'
    | ['()'] {'0' &'0%'} '0%'
    | ['()'] ['$'] {'#' &'0'} {'0' &'0'} '0'
    ;

文字列を解析しようとしたときに次の結果が得られるように、文法を正しく記述する方法:

文字列の場合、True'######'の結果が得られ(['#', '#', '#', '#', '#'], '#')ます (最初のルールが機能します) 。

文字列の場合'#####%'、結果(['#', '#', '#', '#'], '#')は False になるはずです(['#', '#', '#', '#'], '#%')(最初に機能しましたが、2 番目のルールである必要がありました)。

文字列の場合、True'000000'という結果が得られ(['0', '0', '0', '0', '0'], '0')ます (3 番目のルールが機能します) 。

文字列の場合、False'###000'という結果が得られます(最初に機能しましたが、5 番目のルールである必要がありました)。(['#', '#'], '#')

ドキュメントに記載されているルールはばかげていますか、それとも何か間違っていますか?

4

1 に答える 1

1

Tatsu は宣言された順序でルールを試します。

あなたの例では:

| ['()'] ['$'] {'#' &'#'} '#'
| ['()'] {'#' &'#'} '#%'

最初のルールは#####%

2 つのオプションを逆にすると、Tatsu は#%最初に解析を試み#、失敗した場合にのみ解析を試みます。

注意:シンボルは、~パターンが正常に解析された後にルールの他のオプションを試すことを避けるためにも使用できます。

于 2020-10-17T15:37:09.317 に答える