Files
Flee/Parsing/Expression.grammar
2025-10-09 16:16:59 +08:00

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 ")";