Java JJTree“;在;及;包括「;实现

Java JJTree“;在;及;包括「;实现,java,javacc,Java,Javacc,这个问题会让我发疯的。我有一个生成的类,它能够解析这样的表达式:“is_container AND custom_application_name IN”(“myasp.com”、“fraworks”)” 'is_container AND custom_application_name IN ("myasp.com","fraworks")' 评估结果如下: 'is_container AND ((application_name CONTAINS "fraworks" IGNORECASE)

这个问题会让我发疯的。我有一个生成的类,它能够解析这样的表达式:“is_container AND custom_application_name IN”(“myasp.com”、“fraworks”)”

'is_container AND custom_application_name IN ("myasp.com","fraworks")' 评估结果如下:

'is_container AND ((application_name CONTAINS "fraworks" IGNORECASE) OR (application_name CONTAINS "myasp.com" IGNORECASE))' '是容器和((应用程序名称包含“fraworks”IGNORECASE)或(应用程序名称包含“myasp.com”IGNORECASE))' 但我需要这样做:

'is_container AND ((application_name IS "fraworks" IGNORECASE) OR (application_name IS "myasp.com" IGNORECASE))' '是容器和((应用程序名称为“fraworks”IGNORECASE)或(应用程序名称为“myasp.com”IGNORECASE))' 问题是jjTree在处理“IN”literal时如何迭代变量数组(“myasp.com”、“fraworks”),找到它使用“CONTAINS”的位置,然后将“is”放在那里

my.jjt文件中描述以下内容的部分:

将解析整个表达式的函数

void DiscreteRangeExpression()#DiscreteRangeExpression(true):
{
Token t=null;
}
{
    ((Variable() TerminalIn() SetLiteral())|(SetLiteral() TerminalIn() Variable()))
//Variable() TerminalIn() SetLiteral()
(
    TerminalIgnorecase()
{
    jjtThis.setIgnorecase(true);
}
)? 
{
    jjtThis.setOccurType(OCCURSANY);
} 
(
    <ALL>
{
    jjtThis.setOccurType(OCCURSALL);
}
    |
    <ANY> 
    |
    (
            <OCCURS> 
            t=<INTEGER_LITERAL>
{
    jjtThis.setOccurType(OCCURSEQUAL);
    jjtThis.setOccurNum(t.image);
} 
        (
                <PLUS>
{
    jjtThis.setOccurType(OCCURSMORE);
}
                |
                <MINUS>
{
    jjtThis.setOccurType(OCCURSLESS);
}
        )?
    )
)?
}
void DiscreteRangeExpression()#DiscreteRangeExpression(true):
{
令牌t=null;
}
{
((Variable()TerminalIn()SetLiteral())|(SetLiteral()TerminalIn()Variable()))
//变量()TerminalIn()SetLiteral()
(
TerminalIgnorecase()
{
jjthis.setIgnorecase(真);
}
)? 
{
jjthis.setocurtype(ocursany);
} 
(
{
jjthis.setocurtype(ocursall);
}
|
|
(
t=
{
jjthis.setocurtype(ocursequal);
jjthis.setocurnum(t.image);
} 
(
{
jjthis.setocurtype(ocursmore);
}
|
{
jjthis.setOccurType(无占用);
}
)?
)
)?
}
终端“IN”:

void TerminalIn():
{}
{
}
保留字:

TOKEN :
{
< ALL: ["a","A"]["l","L"]["l","L"] >
| < AND: ["a","A"]["n","N"]["d","D"] >
| < ANY: ["a","A"]["n","N"]["y","Y"] >
| < BETWEEN: ["b","B"]["e","E"]["t","T"]["w","W"]["e","E"]["e","E"]["n","N"] >
| < CONTAINS: ["c","C"]["o","O"]["n","N"]["t","T"]["a","A"]["i","I"]["n","N"]["s","S"]>
| < ENDSWITH: ["e","E"]["n","N"]["d","D"]["s","S"]["w","W"]["i","I"]["t","T"]["h","H"]  >
| < HASKEY: ["h","H"]["a","A"]["s","S"]["k","K"]["e","E"]["y","Y"] >
| < IGNORECASE: ["i","I"]["g","G"]["n","N"]["o","O"]["r","R"]["e","E"]["c","C"]["a","A"]["s","S"]["e","E"] >
| < IN: ["i","I"]["n","N"] >
| < IS: ["i","I"]["s","S"] >
| < MATCH: ["m","M"]["a","A"]["t","T"]["c","C"]["h","H"] >
| < MASK: ["m","M"]["a","A"]["s","S"]["k","K"] >
| < NOT: ["n","N"]["o","O"]["t","T"] >
| < NULL: ["n","N"]["u","U"]["l","L"]["l","L"] >
| < OCCURS: ["o","O"]["c","C"]["c","C"]["u","U"]["r","R"]["s","S"] >
| < OR: ["o","O"]["r","R"] >
| < REGEX: ["r","R"]["e","E"]["g","G"]["e","E"]["x","X"]>
| < STARTSWITH: ["s","S"]["t","T"]["a","A"]["r","R"]["t","T"]["s","S"]["w","W"]["i","I"]["t","T"]["h","H"]>
| < LAST: ["l","L"]["a","A"]["s","S"]["t","T"]>
}
令牌:
{

|<和:[a”,“a”][n”,“n”][d”,“d”]>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}

请帮我解决这个问题。如果需要更多信息,请询问。谢谢

那么,您是否只想在解析器现在生成“包含”节点的地方生成“是”节点?我看不到在哪里生成“CONTAINS”节点。您尚未显示
SetLiteral
的规则。
TOKEN :
{
< ALL: ["a","A"]["l","L"]["l","L"] >
| < AND: ["a","A"]["n","N"]["d","D"] >
| < ANY: ["a","A"]["n","N"]["y","Y"] >
| < BETWEEN: ["b","B"]["e","E"]["t","T"]["w","W"]["e","E"]["e","E"]["n","N"] >
| < CONTAINS: ["c","C"]["o","O"]["n","N"]["t","T"]["a","A"]["i","I"]["n","N"]["s","S"]>
| < ENDSWITH: ["e","E"]["n","N"]["d","D"]["s","S"]["w","W"]["i","I"]["t","T"]["h","H"]  >
| < HASKEY: ["h","H"]["a","A"]["s","S"]["k","K"]["e","E"]["y","Y"] >
| < IGNORECASE: ["i","I"]["g","G"]["n","N"]["o","O"]["r","R"]["e","E"]["c","C"]["a","A"]["s","S"]["e","E"] >
| < IN: ["i","I"]["n","N"] >
| < IS: ["i","I"]["s","S"] >
| < MATCH: ["m","M"]["a","A"]["t","T"]["c","C"]["h","H"] >
| < MASK: ["m","M"]["a","A"]["s","S"]["k","K"] >
| < NOT: ["n","N"]["o","O"]["t","T"] >
| < NULL: ["n","N"]["u","U"]["l","L"]["l","L"] >
| < OCCURS: ["o","O"]["c","C"]["c","C"]["u","U"]["r","R"]["s","S"] >
| < OR: ["o","O"]["r","R"] >
| < REGEX: ["r","R"]["e","E"]["g","G"]["e","E"]["x","X"]>
| < STARTSWITH: ["s","S"]["t","T"]["a","A"]["r","R"]["t","T"]["s","S"]["w","W"]["i","I"]["t","T"]["h","H"]>
| < LAST: ["l","L"]["a","A"]["s","S"]["t","T"]>
}