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