JAVACC 进阶–复杂逻辑运算
支持选择判断等IF、ELSE、choose、case等逻辑的运算
多年前使用的时候写的,现在无意发现,整理了一下,记录下来。
options
{
static = false;
JDK_VERSION = "1.8";
DEBUG_PARSER = false;
}
PARSER_BEGIN(JavaccDealRule)
package cn.com.XXX.quality.newJavacc;
import java.util.HashMap;
import java.util.Map;
/** Simple brace matcher. */
public class JavaccDealRule
{
/** Main entry point. */
public static void main(String args []) throws ParseException
{
JavaccDealRule parser = new JavaccDealRule(System.in);
parser.Start();
}
}
PARSER_END(JavaccDealRule)
SKIP :
{
" "
| "\t"
| "\n"
| "\r"
| "\f"
}
TOKEN :
{
< LBRACE : "{" >
| < RBRACE : "}" >
| < LPARENT : "(" >
| < RPARENT : ")" >
}
TOKEN :
{
< IF : "if" >
| < ELSE : "else" >
| < CHOOSE : "choose" >
| < CASE : "case" >
| < CASEDEFAULT : "case default" >
}
TOKEN :
{
< CONSTANT : ("MR_") (< DIGIT >)+ >
| < #DIGIT : [ "a"-"z", "A"-"Z", "1"-"9" ] >
}
TOKEN :
{
< VARIABLE : (< DIGIT2 >)+ >
| < #DIGIT2 : [ "a"-"z", "A"-"Z", "1"-"9" ] >
}
TOKEN :
{
< not : "not" >
}
void test():
{
int not=0;
}
{
<not><LPARENT>Expression()<RPARENT>
{
not=1;
}
}
void Start() :
{
}
{
(
IfStatement()|choseCaseStatement()
)+
}
void IfStatement() :
{
}
{
< IF > < LPARENT > Expression() < RPARENT >Statement()
[
LOOKAHEAD(1)
< ELSE > ElseIFStatement()
]
}
void choseCaseStatement() :
{
}
{
(
< CHOOSE > < LPARENT > Expression() < RPARENT > < LBRACE >
(
< CASE > < LPARENT > ChooseExpression() < RPARENT > < LBRACE > Statement() < RBRACE >
)+
)*
(
<CASEDEFAULT > < LBRACE > Statement() < RBRACE > < RBRACE >
)
}
void Expression() :
{
}
{
< CONSTANT >
}
void Statement() :
{
}
{
(
Block()
|
StatementExpression()
|
(
IfStatement())+
)
}
void ElseIFStatement() :
{
}
{
(
Block()
|
StatementExpression()
|
(IfStatement())
)
}
void StatementExpression() :
{
}
{
< CONSTANT >
}
void Block() :
{
}
{
"{"
(
Statement()
)*
"}"
}
void ChooseExpression() :
{
}
{
< VARIABLE >
}