0

JavaCCパッケージに付属する「インタープリター」の例を見てきました。並列関係式の構文を許可しますが、正しい答えが得られませんでした。

boolean a;
a = 1<2<3;
write a;

インタープリターは「1<2」を処理し、ブール値をスタックに入れるため、これにより ClassCastException が発生しますが、3 番目の変数 3 は整数であるため、ブール値とは比較できません。

を含む ASTLTNode.java を変更してみます

public class ASTLTNode extends SimpleNode {
    public ASTLTNode(int id) {
        super(id);
    }

    public ASTLTNode(ShawaParser p, int id) {
        super(p, id);
    }

    public void interpret()
    {
       jjtGetChild(0).interpret();
       jjtGetChild(1).interpret();
       stack[--top] = new Boolean(((Integer)stack[top]).intValue() <
                           ((Integer)stack[top + 1]).intValue());
    }
}

interpret() の最後に「top++」を追加すると、スタックは最後の値を保持しますが、プロセスが完了すると、ブール値ではなく最後の桁が表示されます。

これを行うアイデアはありますか?どうもありがとう。

4

1 に答える 1

1

SPL(Stupid Programming Language)構文では、次のような式が許可されているのは正しいです1 < 2 < 3。これは仕様で確認できます。

void RelationalExpression() #void :
{}
{
  AdditiveExpression()
  (
    "<" AdditiveExpression() #LTNode(2)
   |
    ">" AdditiveExpression() #GTNode(2)
   |
    "<=" AdditiveExpression() #LENode(2)
   |
    ">=" AdditiveExpression() #GENode(2)
  )*
}

ただし、式1 < 2 < 3構文的に許可されているからといって、意味的に許可されているわけではありません。

あなたが発見したように、あなたの式はその構文チェックに合格しますが、それはいわゆる静的セマンティックエラー、特にタイプエラーを持っています。

一般的なプログラミング言語には、これらのセマンティックエラーには多くの種類があります。たとえば、Javaでは、4つのパラメーターを受け取るメソッドを宣言できますが、2つで呼び出すと、どうなりますか?呼び出しは構文的に正しいですが(idの後に左括弧が続き、式のコンマ区切りリストが続きます)、意味エラーがあります。呼び出しの引数の数が宣言されたパラメーターの数と一致しません。

(Pythonのように)true iffを返す有効なブール式になりたい場合は、SPLのセマンティクスを変更する必要があり1 < 2 < 3ます。これはスタック指向なので、何ができますか?どれどれ。あなたが持っていたとしましょう1<22<3

x < y < z

まず、xを押し、yを押して、未満を実行します。ここで、スタックの最上位(現在)をx < yに置き換えてから、テスト(つまり)を続行する場合。ただし、falseが生成されたことがわかった場合は、falseをスタックの一番上に残し、残りの未満をスキップする必要があります。trueyy < zx < y

これはあなたが持っていても機能します

e1 < e2 < e3 < e4 < e5 < e6

等々。<秘訣は、戻ってきた偽を見つけたときに早期に救済することです。これは、短絡andsおよびorsの実装を思い出させるかもしれません。それが役に立てば幸い。

于 2011-08-07T06:38:44.090 に答える