136 lines
4.3 KiB
Plaintext
136 lines
4.3 KiB
Plaintext
%header%
|
|
|
|
DESCRIPTION = "A general expression grammar with assignment support"
|
|
AUTHOR = "Eugene Ciloci (Modified By LiuBai)"
|
|
VERSION = "2.0"
|
|
DATE = "October 2025"
|
|
|
|
GRAMMARTYPE = "LL"
|
|
CASESENSITIVE = "False"
|
|
|
|
LICENSE = "This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public License
|
|
as published by the Free Software Foundation; either version 2.1
|
|
of the License, or (at your option) any later version.
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with this library; if not, write to the Free
|
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
|
MA 02111-1307, USA.
|
|
"
|
|
|
|
COPYRIGHT = "Copyright (c) 2007 Eugene Ciloci"
|
|
|
|
%tokens%
|
|
ADD = "+"
|
|
SUB = "-"
|
|
MUL = "*"
|
|
DIV = "/"
|
|
POWER = "^"
|
|
MOD = "%"
|
|
LEFT_PAREN = "("
|
|
RIGHT_PAREN = ")"
|
|
LEFT_BRACE = "["
|
|
RIGHT_BRACE = "]"
|
|
EQ = "=="
|
|
LT = "<"
|
|
GT = ">"
|
|
LTE = "<="
|
|
GTE = ">="
|
|
NE = "<>"
|
|
AND = "AND"
|
|
OR = "OR"
|
|
XOR = "XOR"
|
|
NOT = "NOT"
|
|
IN = "in"
|
|
DOT = "."
|
|
ARGUMENT_SEPARATOR = ","
|
|
ARRAY_BRACES = "[]"
|
|
LEFT_SHIFT = "<<"
|
|
RIGHT_SHIFT = ">>"
|
|
WHITESPACE = <<\s+>> %ignore%
|
|
|
|
// Primitives
|
|
INTEGER = <<\d+(u|l|ul|lu)?>>
|
|
REAL = <<\d*\.\d+([e][+-]\d{1,3})?f?>>
|
|
STRING_LITERAL = <<"([^"\r\n\\]|\\u[0-9a-f]{4}|\\[\\"'trn])*">>
|
|
CHAR_LITERAL = <<'([^'\r\n\\]|\\u[0-9a-f]{4}|\\[\\"'trn])'>>
|
|
TRUE = "True"
|
|
FALSE = "False"
|
|
IDENTIFIER = <<[a-z_]\w*>>
|
|
HEX_LITERAL = <<0x[0-9a-f]+(u|l|ul|lu)?>>
|
|
NULL_LITERAL = "null"
|
|
TIMESPAN = <<##(\d+\.)?\d{2}:\d{2}(:\d{2}(\.\d{1,7})?)?#>>
|
|
DATETIME = <<#[^#]+#>>
|
|
|
|
// Special Functions
|
|
IF = "if"
|
|
CAST = "cast"
|
|
ASSIGN = "="
|
|
|
|
%productions%
|
|
|
|
Expression = AssignmentExpression | XorExpression;
|
|
|
|
AssignmentExpression = IDENTIFIER "=" XorExpression;
|
|
|
|
XorExpression = OrExpression {XOR OrExpression};
|
|
|
|
OrExpression = AndExpression {OR AndExpression};
|
|
|
|
AndExpression = NotExpression {AND NotExpression};
|
|
|
|
NotExpression = NOT? InExpression;
|
|
|
|
InExpression = CompareExpression [IN InTargetExpression];
|
|
|
|
InTargetExpression = FieldPropertyExpression | InListTargetExpression;
|
|
|
|
InListTargetExpression = "(" ArgumentList ")";
|
|
|
|
CompareExpression = ShiftExpression {("==" | ">" | "<" | ">=" | "<=" | "<>") ShiftExpression};
|
|
|
|
ShiftExpression = AdditiveExpression {("<<" | ">>") AdditiveExpression};
|
|
|
|
AdditiveExpression = MultiplicativeExpression {("+" | "-") MultiplicativeExpression};
|
|
|
|
MultiplicativeExpression = PowerExpression {("*" | "/" | "%") PowerExpression};
|
|
|
|
PowerExpression = NegateExpression {"^" NegateExpression};
|
|
|
|
NegateExpression = "-"? MemberExpression;
|
|
|
|
MemberExpression = BasicExpression {MemberAccessExpression | IndexExpression};
|
|
|
|
MemberAccessExpression = "." MemberFunctionExpression;
|
|
|
|
BasicExpression = LiteralExpression | ExpressionGroup | MemberFunctionExpression | SpecialFunctionExpression;
|
|
|
|
MemberFunctionExpression = FieldPropertyExpression | FunctionCallExpression;
|
|
|
|
FieldPropertyExpression = IDENTIFIER;
|
|
|
|
SpecialFunctionExpression = IfExpression | CastExpression;
|
|
|
|
IfExpression = IF "(" Expression "," Expression "," Expression ")";
|
|
|
|
CastExpression = CAST "(" Expression "," CastTypeExpression ")";
|
|
|
|
CastTypeExpression = IDENTIFIER {"." IDENTIFIER} ARRAY_BRACES?;
|
|
|
|
IndexExpression = "[" ArgumentList "]";
|
|
|
|
FunctionCallExpression = IDENTIFIER "(" ArgumentList? ")";
|
|
|
|
ArgumentList = Expression {"," Expression};
|
|
|
|
LiteralExpression = INTEGER | REAL | STRING_LITERAL | BooleanLiteralExpression | HEX_LITERAL | CHAR_LITERAL | NULL_LITERAL | DATETIME | TIMESPAN;
|
|
|
|
BooleanLiteralExpression = TRUE | FALSE;
|
|
|
|
ExpressionGroup = "(" Expression ")"; |