2017-05-10 14 views
0

私は次の2種類のものとすることができるifElseステートメントを有するJavaCC - 戻り値の型に基づいた選択?

A)ifElse(条件、expression_bool_result、expression_bool_result)

expression_bool_resultのいずれかTRUE/FALSEの結果であり得る一方、及び()、または()、==、!= ...またはさらにifElse

B)ifElse(条件、expression_arith_result、expression_arith_result)

expression_arith_resultいずれか任意の数、復帰さらに関数の計算の結果である場合がありますナンバー...(または、 r ifElse)

私はjavaccの初心者ですから、パーサーが明確な決定を下すことができるように、どのようにプロダクションが見えるかをお聞きしたいと思います。

現在、私は

Warning: Choice conflict involving two expansions at 
line 824, column 5 and line 825, column 5 respectively. 
A common prefix is: "ifElse" "(" 
Consider using a lookahead of 3 or more for earlier expansion. 

警告を取得 - 私の知る限りでは - (ifelseについて)私の文法があいまいであることを意味します。

明白にそれを書く方法がない場合は、どのように示唆された先読みはどうでしょうか?

フィードバックをいただきありがとうございます。

答えて

0

すべての場合において、先読み量が一定でないと、このあいまい性を解決できない可能性があります。有効なexpression_arith_resultを構成するトークンの任意の長いストリームを持つことができますが、次に比較演算子と別の算術値が続き、expression_bool_resultになります。

解決策は、任意の2つの式をとる単一のifElseステートメントを持つことです。 2つの表現の間の型の必要な合意は、文法ではなく意味論の問題である。

+0

Thx!あなたは私に例(またはそれへのリンク)を教えてくれますか?あなたの最後の文章または推薦を正しく理解しているかどうかはわかりません。 – mindpixel

0

固定長の先読みで選択肢を解決できないという点で、Jasonの答えは正しいです。しかし、JavaCCは先読みの固定長に制限しません。だからあなたは次のことができます。

void IfExpression() : 
{ } 
{ LOOKAHEAD(<IFELSE> "(" Condition() "," BooleanExpression()) 
    BooleanIfExpression() 
| 
    ArithmeticIfExpression() 
} 
関連する問題