2

これは簡単な質問です。次のパーサー ルールがあるとします。

ifStatement
 : expr3b=IF logical (~(THEN)) expression* (ELSE expression *)? ENDIF // missing THEN
 ;

これがこの文字列と一致しないのはなぜですか?

"IF CODE=\"10\" DUE_DATE < YESTERDAY ENDIF"

( IFTHENELSE、およびENDIFは、想定どおりに定義されたトークンです。logicalおよびexpressionその他のルールです)。

4

1 に答える 1

1

次の行はあなたの文法からの逐語的だと思います。

ifStatement : expr3b=IF logical (~(THEN)) expression* (ELSE expression *)? ENDIF;

その場合は、次のように変更する必要があります。

ifStatement : expr3b=IF logical expression* (ELSE expression *)? ENDIF;

そのままでは、(~(THEN))「一致しない限り、任意の1つのトークンに一致する」と言いますTHEN。終了後の最初のトークンlogicalID(または同様の)ですDUE_DATEifStatement満たすためにそれを消費し(~(THEN))ます。これは< YESTERDAY満たすために残しexpressionますが、失敗します。

次の入力は、次の条件を満たすifStatementため、質問で受け入れられます。ENDIF(~(THEN))

IF CODE=\"10\" ENDIF DUE_DATE < YESTERDAY ENDIF

最初のものは一致するためだけENDIFに消費されるため、これは期待どおりに機能します。(~(THEN))

于 2012-12-10T19:44:01.123 に答える