这是一个简短的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解析器来处理这一部分?
感谢。
答案 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"])* "}" > }