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

如果我正确理解了这个问题,您希望在一段时间内允许基本上任意输入,然后切换回您的语言。如果您可以决定何时完全基于标记进行切换,那么使用两个词法状态很容易做到这一点。使用您的编程语言的默认状态。在默认状态下看到“{”时,切换到其他状态

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

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

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

在解析器中,您可以拥有

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

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

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

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