0

以下は、短い javaCC コードです。

PARSER_BEGIN(TestParser)

public class TestParser
    {
    }

PARSER_END(TestParser)

SKIP :
    {
    " "
    | "\t"
    | "\n"
    | "\r"
    }

TOKEN : /* LITERALS */
{
  <VOID: "void">
| <LPAR: "("> | <RPAR: ")">
| <LBRAC: "{"> | <RBRAC: "}">
| <COMMA: ",">
| <DATATYPE: "int">
| <#LETTER: ["_","a"-"z","A"-"Z"] >
| <#DIGIT: ["0"-"9"] >
| <DOUBLE_QUOTE_LITERAL: "\"" (~["\""])*"\"" >
| <IDENTIFIER: <LETTER> (<LETTER>|<DIGIT>)* >
| <VARIABLE: "$"<IDENTIFIER> >
}

public void input():{} { (statement())+ <EOF> }
private void statement():{}
    {
    <VOID> <IDENTIFIER> <LPAR> (<DATATYPE> <IDENTIFIER> (<COMMA> <DATATYPE> <IDENTIFIER>)*)? <RPAR>
        <LBRAC>

        <RBRAC>
    }

このパーサーで、次の種類の入力を「文法のない」セクション (文字 '}' がセクションの最後になります) で処理できるようにしたいと思います。

void fun(int i, int j)
 {
 Hello world the value of i is ${i} 
  and j=${j}.
 }

文法のないセクションは

java.util.List<String_or_VariableReference>

このセクションを処理するには、javacc パーサーをどのように変更すればよいですか?

ありがとう。

4

1 に答える 1

1

私が質問を正しく理解している場合は、本質的に任意の入力をしばらく許可してから、自分の言語に切り替えてください。純粋にトークンに基づいて切り替えをいつ行うかを決定できる場合、これは 2 つの字句状態を使用して簡単に実行できます。プログラミング言語のデフォルト状態を使用してください。DEFAULT状態で「{」が表示されたら、他の状態に切り替えます

TOKEN: { <LBRACE : "{" > : FREE } 

FREE 状態で「}」が表示されると、DEFAULT 状態に戻ります。他の文字が見つかった場合は、それをパーサーに渡します。

<FREE> TOKEN { <RBRACE : "}" > : DEFAULT }
<FREE> TOKEN { <OTHER : ~["}"] > : FREE }

あなたが持つことができるパーサーで

void freeSection() : {} { <LBRACE> (<OTHER>)* <RBRACE> }

これらすべてのその他の文字で何かをしたい場合は、FAQ の質問 5.2 を参照してください。http://www.engr.mun.ca/~theo/JavaCC-FAQ

"${i}" などの変数参照を FREE 状態でキャプチャしたい場合は、それも可能です。追加

<FREE> TOKEN { <VARREF : "${" (["a"-"Z"]|["A"-"Z"])* "}" > } 
于 2013-04-27T18:41:17.433 に答える