javaCC中的无语法部分
下面是一个简短的javaCC代码:javaCC中的无语法部分,java,grammar,javacc,Java,Grammar,Javacc,下面是一个简短的javaCC代码: PARSER_BEGIN(TestParser) public class TestParser { } PARSER_END(TestParser) SKIP : { " " | "\t" | "\n" | "\r" } TOKEN : /* LITERALS */ { <VOID: "void"> | <LPAR: "("> | <RPAR: ")"&
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>
}
无语法部分将返回一个
java.util.List<String_or_VariableReference>
java.util.List
我应该如何修改javacc解析器来处理这个部分
谢谢。如果我正确理解了问题,您希望允许基本上任意的输入一段时间,然后切换回您的语言。如果您可以决定何时纯粹基于令牌进行切换,那么使用两种词汇状态就很容易做到这一点。使用编程语言的默认状态。当在默认状态下看到“{”时,切换到其他状态
TOKEN: { <LBRACE : "{" > : FREE }
TOKEN:{:FREE}
在自由状态下,当看到“}”时,切换回默认状态;当看到任何其他字符时,将其传递给解析器
<FREE> TOKEN { <RBRACE : "}" > : DEFAULT }
<FREE> TOKEN { <OTHER : ~["}"] > : FREE }
TOKEN{:DEFAULT}
令牌{:FREE}
在解析器中,您可以
void freeSection() : {} { <LBRACE> (<OTHER>)* <RBRACE> }
void freeSection():{}{()*}
如果您想处理所有其他字符,请参阅常见问题解答中的问题5.2
如果您想捕获自由状态下的变量引用,例如“${i}”,您也可以访问它。加
<FREE> TOKEN { <VARREF : "${" (["a"-"Z"]|["A"-"Z"])* "}" > }
TOKEN{}
<FREE> TOKEN { <VARREF : "${" (["a"-"Z"]|["A"-"Z"])* "}" > }