Flee
This commit is contained in:
133
Parsing/Expression.grammar
Normal file
133
Parsing/Expression.grammar
Normal file
@@ -0,0 +1,133 @@
|
||||
%header%
|
||||
|
||||
DESCRIPTION = "A general expression grammar"
|
||||
AUTHOR = "Eugene Ciloci"
|
||||
VERSION = "1.0"
|
||||
DATE = "May 2007"
|
||||
|
||||
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"
|
||||
|
||||
%productions%
|
||||
|
||||
Expression = 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 ")";
|
Reference in New Issue
Block a user