📄 fmparser.jj
字号:
boolean haveNot = false;
Token t = null, start=null;
}
{
(
result=UnaryPlusMinusExpression()
|
result=NotExpression()
|
result=PrimaryExpression()
)
{
return result;
}
/*
(
t=<EXCLAM>
{
haveNot = !haveNot;
if (start == null)
start = t;
}
)*
exp=PrimaryExpression()
{
result = exp;
if (haveNot) {
booleanLiteralOnly(exp);
result = new NotExpression(exp);
result.setLocation(template, start, exp);
}
return result;
}
*/
}
Expression NotExpression() :
{
Token t;
Expression exp, result=null;
ArrayList nots = new ArrayList();
}
{
(
t=<EXCLAM> {nots.add(t);}
)+
exp=PrimaryExpression()
{
for (int i=0; i<nots.size(); i++) {
result = new NotExpression(exp);
Token tok = (Token) nots.get(nots.size() -i -1);
result.setLocation(template, tok, exp);
exp = result;
}
return result;
}
}
Expression UnaryPlusMinusExpression() :
{
Expression exp, result;
boolean isMinus = false;
Token t;
}
{
(
t=<PLUS>
|
t=<MINUS> {isMinus = true;}
)
exp=PrimaryExpression()
{
result = new UnaryPlusMinusExpression(exp, isMinus);
result.setLocation(template, t, exp);
return result;
}
}
Expression AdditiveExpression() :
{
Expression lhs, rhs, result;
boolean plus;
}
{
lhs=MultiplicativeExpression() {result = lhs;}
(
LOOKAHEAD(<PLUS>|<MINUS>)
(
(
<PLUS> {plus = true;}
|
<MINUS> {plus = false;}
)
)
rhs=MultiplicativeExpression()
{
if (plus) {
// plus is treated separately, since it is also
// used for concatenation.
result = new AddConcatExpression(lhs, rhs);
}
else {
numberLiteralOnly(lhs);
numberLiteralOnly(rhs);
result = new ArithmeticExpression(lhs,
rhs,
ArithmeticExpression.SUBSTRACTION);
}
result.setLocation(template, lhs, rhs);
lhs = result;
}
)*
{
return result;
}
}
/**
* A unary expression followed by zero or more
* unary expressions with operators in between.
*/
Expression MultiplicativeExpression() :
{
Expression lhs, rhs, result;
int operation = ArithmeticExpression.MULTIPLICATION;
}
{
lhs=UnaryExpression() {result = lhs;}
(
LOOKAHEAD(<TIMES>|<DIVIDE>|<PERCENT>)
(
(
<TIMES> {operation = ArithmeticExpression.MULTIPLICATION;}
|
<DIVIDE> {operation = ArithmeticExpression.DIVISION;}
|
<PERCENT>{operation = ArithmeticExpression.MODULUS;}
)
)
rhs=UnaryExpression()
{
numberLiteralOnly(lhs);
numberLiteralOnly(rhs);
result = new ArithmeticExpression(lhs, rhs, operation);
result.setLocation(template, lhs, rhs);
lhs = result;
}
)*
{
return result;
}
}
Expression EqualityExpression() :
{
Expression lhs, rhs, result;
Token t;
}
{
lhs=RelationalExpression() {result = lhs;}
[
LOOKAHEAD(<NOT_EQUALS>|<EQUALS>|<DOUBLE_EQUALS>)
(
t=<NOT_EQUALS>
|
t=<EQUALS>
|
t=<DOUBLE_EQUALS>
)
rhs=RelationalExpression()
{
notHashLiteral(lhs, "scalar");
notHashLiteral(rhs, "scalar");
notListLiteral(lhs, "scalar");
notListLiteral(rhs, "scalar");
result = new ComparisonExpression(lhs, rhs, t.image);
result.setLocation(template, lhs, rhs);
}
]
{
return result;
}
}
Expression RelationalExpression() :
{
Expression lhs, rhs, result;
Token t;
}
{
lhs=RangeExpression() {result = lhs;}
[
LOOKAHEAD(<NATURAL_GTE>|<ESCAPED_GTE>|<NATURAL_GT>|<ESCAPED_GT>|<LESS_THAN_EQUALS>|<LESS_THAN_EQUALS>|<LESS_THAN>)
(
t=<NATURAL_GTE>
|
t=<ESCAPED_GTE>
|
t=<NATURAL_GT>
|
t=<ESCAPED_GT>
|
t=<LESS_THAN_EQUALS>
|
t=<LESS_THAN>
)
rhs=RangeExpression()
{
notHashLiteral(lhs, "scalar");
notHashLiteral(rhs, "scalar");
notListLiteral(lhs, "scalar");
notListLiteral(rhs, "scalar");
notStringLiteral(lhs, "number");
notStringLiteral(rhs, "number");
result = new ComparisonExpression(lhs, rhs, t.image);
result.setLocation(template, lhs, rhs);
}
]
{
return result;
}
}
Expression RangeExpression() :
{
Expression lhs, rhs=null, result;
}
{
lhs=AdditiveExpression() {result = lhs;}
[
LOOKAHEAD(<DOT_DOT>)
<DOT_DOT>
[
LOOKAHEAD(Expression())
rhs=AdditiveExpression()
]
{
numberLiteralOnly(lhs);
if (rhs != null) {
numberLiteralOnly(rhs);
}
Range range = new Range(lhs, rhs);
if (rhs != null) {
range.setLocation(template, lhs, rhs);
} else {
range.setLocation(template, lhs, lhs);
}
result = range;
}
]
{
return result;
}
}
Expression AndExpression() :
{
Expression lhs, rhs, result;
}
{
lhs=EqualityExpression() {result = lhs;}
(
LOOKAHEAD(<AND>)
<AND>
rhs=EqualityExpression()
{
booleanLiteralOnly(lhs);
booleanLiteralOnly(rhs);
result = new AndExpression(lhs, rhs);
result.setLocation(template, lhs, rhs);
lhs = result;
}
)*
{
return result;
}
}
Expression OrExpression() :
{
Expression lhs, rhs, result;
}
{
lhs=AndExpression() {result = lhs;}
(
LOOKAHEAD(<OR>)
<OR>
rhs=AndExpression()
{
booleanLiteralOnly(lhs);
booleanLiteralOnly(rhs);
result = new OrExpression(lhs, rhs);
result.setLocation(template, lhs, rhs);
lhs = result;
}
)*
{
return result;
}
}
ListLiteral ListLiteral() :
{
ArrayList values = new ArrayList();
Token begin, end;
}
{
begin=<OPEN_BRACKET>
values=PositionalArgs()
end=<CLOSE_BRACKET>
{
ListLiteral result = new ListLiteral(values);
result.setLocation(template, begin, end);
return result;
}
}
Expression NumberLiteral() :
{
Token op = null, t;
}
{
(
t=<INTEGER>
|
t=<DECIMAL>
)
{
String s = t.image;
Expression result = new NumberLiteral(template.getArithmeticEngine().toNumber(s));
Token startToken = (op != null) ? op : t;
result.setLocation(template, startToken, t);
return result;
}
}
Identifier Identifier() :
{
Token t;
}
{
t=<ID>
{
Identifier id = new Identifier(t.image);
id.setLocation(template, t, t);
return id;
}
}
Expression IdentifierOrStringLiteral() :
{
Expression exp;
}
{
(
exp=Identifier()
|
exp=StringLiteral(false)
)
{
return exp;
}
}
BuiltinVariable BuiltinVariable() :
{
Token dot, name;
}
{
dot=<DOT>
name=<ID>
{
BuiltinVariable result = null;
try {
result = new BuiltinVariable(name.image);
} catch (ParseException pe) {
pe.lineNumber = dot.beginLine;
pe.columnNumber = dot.beginColumn;
throw pe;
}
result.setLocation(template, dot, name);
return result;
}
}
/**
* Production that builds up an expression
* using the dot or dynamic key name
* or the args list if this is a method invocation.
*/
Expression AddSubExpression(Expression exp) :
{
Expression result = null;
}
{
(
result=DotVariable(exp)
|
result=DynamicKey(exp)
|
result=MethodArgs(exp)
|
result=BuiltIn(exp)
|
result=DefaultTo(exp)
|
result=Exists(exp)
)
{
return result;
}
}
Expression DefaultTo(Expression exp) :
{
Expression rhs = null;
Token t;
}
{
t=<EXCLAM>
[
LOOKAHEAD(Expression())
rhs=Expression()
]
{
DefaultToExpression result = new DefaultToExpression(exp, rhs);
if (rhs ==null) {
result.setLocation(template, exp, t);
}
else {
result.setLocation(template, exp, rhs);
}
return result;
}
}
Expression Exists(Expression exp) :
{
Token t;
}
{
t=<EXISTS>
{
ExistsExpression result = new ExistsExpression(exp);
result.setLocation(template, exp, t);
return result;
}
}
Expression BuiltIn(Expression exp) :
{
Token t=null;
}
{
<BUILT_IN>
t=<ID>
{
BuiltIn result = null;
try {
result = BuiltIn.newBuiltIn(exp, t.image, t, templateName);
} catch (ParseException pe) {
pe.lineNumber = t.beginLine;
pe.columnNumber = t.beginColumn;
throw pe;
}
result.setLocation(template, exp, t);
return result;
}
}
/**
* production for when a key is specified by <DOT> + keyname
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -