0

こんにちは、言語のパーサーを作ろうとしています。

しかし、X > 5 のような論理式を if 式に入れると、パーサーはエラーを返します。

たとえば、次のステートメントを作成するとif (x>5) a=3; 、パーサーはエラー条件 x>5 を返します。

結果なしで問題を修正しようとしています。私はフレックス/バイソンの初心者です。

どんな助けでも;

フレックスファイルは次のとおりです。

`.....

"!"             {return NOT;}

"+" | "-"       {return MONAD_OPERATOR;}

"*" | "/" | "%"     {return DIAD_OPERATOR;}

"==" | "!=" | ">" | "<" | ">=" | "<="   {return SXES_OPERATOR;}

...`

バイソンファイルは次のとおりです。

...

    if_statement : IF '(' logic_expression ')' statement NEWLINE
                 | IF '(' logic_expression ')' statement ELSE statement NEWLINE
                 ;  ;
    logic_expression : 
        logic_expression sxes_operator logic_expression
        | ID
        | NUM
        | logic_expression diad_operator logic_expression
        | '(' logic_expression ')'
        | NOT logic_expression
        | logic_expression log_operator logic_expression
        ;

monad_operator : MONAD_OPERATOR ; 
diad_operator : DIAD_OPERATOR ;
sxes_operator : SXES_OPERATOR ;
4

1 に答える 1

0

(この質問はコメントで回答されました。回答がない質問を参照してください。ただし、コメントで問題が解決しました(またはチャットで拡張されました)

@rici は、文法に shift-reduce 競合があることを指摘しました。

ほとんどの場合、パーサーは、shift-reduce 競合に対して合理的な処理を行います。しかし、それはあなたが期待するものではないかもしれないので、そうです、それらを修正する必要があります. 特にreduce-reduceの競合がある場合は、予期しない構文エラーが発生することがあります。

文法があいまいなので、競合が発生します。何人かはわかりませんが、たくさんいると思います。diad_operatorまた、端末 ( ) の可能性があるものに不要な非端末 ( ) を使用することは避けたいと思いDYAD_OPERATORます。あいまいさがあります:a < 3 + 4あなたの文法では、 と の両方を解析として使用できます[[[a] < [3]] + [4]]( [[a] < [[3] + [4]]]a [...]を示すために使用しますlogic_expression) 。

@Grijesh Chauhan は次のように締めくくっています。

、 、"!="">="、 の"<=""!"にのルールを定義しました。さらに、私は代わりに好む"<"">"[]""

于 2015-01-24T13:54:24.780 に答える