javaCC中的无语法部分

时间:2013-04-26 14:35:20

标签: java grammar javacc

这是一个简短的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解析器来处理这一部分?

感谢。

1 个答案:

答案 0 :(得分:1)

如果我正确理解了这个问题,你想暂时允许任意输入,然后切换回你的语言。如果你可以决定何时完全基于令牌进行切换,那么使用两个词法状态很容易做到这一点。使用编程语言的默认状态。当在DEFAULT状态中看到“{”时,切换到另一个状态

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

在FREE状态下,当看到“}”时,切换回DEFAULT状态;当看到任何其他字符时,将其传递给解析器。

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

在解析器中你可以拥有

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

如果您想对所有其他字符执行某些操作,请参阅常见问题解答中的问题5.2。 http://www.engr.mun.ca/~theo/JavaCC-FAQ

如果你想在FREE状态下捕获变量引用,例如“$ {i}”,你也可以这样做。添加

<FREE> TOKEN { <VARREF : "${" (["a"-"Z"]|["A"-"Z"])* "}" > }