QA@IT

javacc 繰り返しブロックから抜けてもらうにはどうしたらいいか。

1730 PV

日本語で書けるプログラミング言語を作ろうとしています。
今条件文・出力文・繰り返し文の一部が実装できていて、関数を実装しようとしています。
関数名は{}で囲むこととし、「{関数名}ここから」から「{関数名}ここまで」を関数としようとしています。
そして、関数の呼び出しは「{関数名}を始める」で行おうとしています。
関数の中のコード群の中にその関数の呼び出しを定義すると、関数終了と呼び出しの先頭がかぶっているためChoice conflictが出ます。
呼び出しのとこにLOOKAHEADを書いてもそれは消えず、以下のコードで試してみると終了のとこで構文エラーとなってしまいます。

{始まり}ここから
    「始まり始まり」と言う
{始まり}ここまで

以下がjavaccのコードになります。

void kansuu() :
{
    Token ns=null,ne=null;
    ProgramNode p=new ProgramNode();
}
{
    ns=<KANSUU> <KOKOKARA>
    codes(p){System.out.println("ブロック抜けた");}
    ne=<KANSUU> <KOKOMADE>
    {
        if(ns.image.equals(ne.image)){
            program.put(ns.image,p);
        }
    }
}

void codes(ProgramNode p) :
{
    Node m=null;
}
{
    ((LOOKAHEAD(enzan()<TOIU> | enzan2()<TOIU>)m=print()
    |LOOKAHEAD(<KANSUU><WOHAZIMERU>)m=yobidasi()
    |m=kurikaesu()
    |m=mosinara())
    {
        p.code.add(m);
    })*
}

ProgramNode yobidasi() :
{
    Token n=null;
}
{
    n=<KANSUU><WOHAZIMERU>
    {
        if(!n.image.equals("{始まり}") && program.contains(n.image)){
            return program.get(n.image);
        }
        else{
            return null;
        }
    }
}

関数終了の手前で"ブロック抜けた"という出力をするように書いているのですが、先ほどのコードの場合それが出力されずにcodesで定義している文の先頭が候補として出てきます。

関数名あったみたい:{始まり}
ここからもあったみたい
と言うあった
Exception in thread "main" ParseException: Encountered " "}" "{\u59cb\u307e\u308
a} "" at line 3, column 1.
Was expecting one of:
    "\u3082\u3057" ...
    "\u300d" ...
    <SUUZI> ...
    "(" ...
    "(" ...
    "\u300d" ...
    <SUUZI> ...
    "(" ...
    "\u300d" ...
    <SUUZI> ...
    "(" ...

        at Programing.generateParseException(Programing.java:986)
        at Programing.jj_consume_token(Programing.java:867)
        at Programing.codes(Programing.java:138)
        at Programing.kansuu(Programing.java:93)
        at Programing.code(Programing.java:82)
        at Programing.main(Programing.java:26)

codesで定義しているもののどれにも当てはまらない場合はcodesの()*を抜けてくれるのではないのでしょうか?

  • javaccの質問ってどこでする方がいいんですかね? -
ウォッチ

この質問への回答やコメントをメールでお知らせします。