Advertisement
Guest User

Untitled

a guest
Jun 7th, 2015
408
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 31.62 KB | None | 0 0
  1. using Irony.Parsing;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7.  
  8. namespace AngelScript
  9. {
  10.     [Language("Angel Script", "1.0", "Angel Script Programming Language")]
  11.     public class AngelScriptGrammar : Irony.Parsing.Grammar
  12.     {
  13.         public AngelScriptGrammar()
  14.         {
  15.             var singleLineComment = new CommentTerminal("SingleLineComment", "//", "\r", "\n", "\u2085", "\u2028", "\u2029");
  16.             var delimitedComment = new CommentTerminal("DelimitedComment", "/*", "*/");
  17.             NonGrammarTerminals.Add(singleLineComment);
  18.             NonGrammarTerminals.Add(delimitedComment);
  19.  
  20.             //  Regular Operators
  21.             var DOT = ToTerm(".");
  22.             var COLON = ToTerm(":");
  23.             var COLONCOLON = ToTerm("::");
  24.             var SEMIC = ToTerm(";");
  25.             var COMMA = ToTerm(",");
  26.  
  27.             #region Operators
  28.  
  29.             //  Standard Operators
  30.             var EQ = Operator("=");
  31.  
  32.             var OpeAND = Operator("&&");
  33.             var OpeOR = Operator("||");
  34.             var OpeNOT = Operator("!");
  35.  
  36.             var OpeEQ = Operator("==");
  37.             var OpeNEQ = Operator("!=");
  38.             var OpeBig = Operator(">");
  39.             var OpeBigEQ = Operator(">=");
  40.             var OpeSm = Operator("<");
  41.             var OpeSmEQ = Operator("<=");
  42.  
  43.             var OpeAdd = Operator("+");
  44.             var OpeSub = Operator("-");
  45.             var OpeMul = Operator("*");
  46.             var OpeDiv = Operator("/");
  47.             var OpePow = Operator("^");
  48.  
  49.             var OpePre = Operator("%");
  50.             var OpeAt = Operator("@");
  51.             var OpeAmp = Operator("&");
  52.             var OpeQmark = Operator("?");
  53.  
  54.             #endregion
  55.  
  56.             #region Keywords
  57.  
  58.             var k_AND = Keyword("and");
  59.             var k_ABSTRACT = Keyword("abstract");
  60.             var k_AUTO = Keyword("auto");
  61.             var k_BOOL = Keyword("bool");
  62.             var k_BREAK = Keyword("break");
  63.             var k_CASE = Keyword("case");
  64.             var k_CAST = Keyword("cast");
  65.             var k_CLASS = Keyword("class");
  66.             var k_CONST = Keyword("const");
  67.             var k_CONTINUE = Keyword("continue");
  68.             var k_DEFAULT = Keyword("default");
  69.             var k_DO = Keyword("do");
  70.             var k_DOUBLE = Keyword("double");
  71.             var k_ELSE = Keyword("else");
  72.             var k_ENUM = Keyword("enum");
  73.             var k_FALSE = Keyword("false");
  74.             var k_FINAL = Keyword("final");
  75.             var k_FLOAT = Keyword("float");
  76.             var k_FOR = Keyword("for");
  77.             var k_FROM = Keyword("from");
  78.             var k_FUNCDEF = Keyword("funcdef");
  79.             var k_GET = Keyword("get");
  80.             var k_IF = Keyword("if");
  81.             var k_IMPORT = Keyword("import");
  82.             var k_IN = Keyword("in");
  83.             var k_INOUT = Keyword("inout");
  84.             var k_INT = Keyword("int");
  85.             var k_INTERFACE = Keyword("interface");
  86.             var k_INT8 = Keyword("int8");
  87.             var k_INT16 = Keyword("int16");
  88.             var k_INT32 = Keyword("int32");
  89.             var k_INT64 = Keyword("int64");
  90.             var k_IS = Keyword("is");
  91.             var k_MIXIN = Keyword("mixin");
  92.             var k_NAMESPACE = Keyword("namespace");
  93.             var k_NOT = Keyword("not");
  94.             var k_NULL = Keyword("null");
  95.             var k_OR = Keyword("or");
  96.             var k_OUT = Keyword("out");
  97.             var k_OVERRIDE = Keyword("override");
  98.             var k_PRIVATE = Keyword("private");
  99.             var k_PROTECTED = Keyword("protected");
  100.             var k_RETURN = Keyword("return");
  101.             var k_SET = Keyword("set");
  102.             var k_SHARED = Keyword("shared");
  103.             var k_SUPER = Keyword("super");
  104.             var k_SWITCH = Keyword("switch");
  105.             var k_THIS = Keyword("this");
  106.             var k_TRUE = Keyword("true");
  107.             var k_TYPEDEF = Keyword("typedef");
  108.             var k_UINT = Keyword("uint");
  109.             var k_UINT8 = Keyword("uint8");
  110.             var k_UINT16 = Keyword("uint16");
  111.             var k_UINT32 = Keyword("uint32");
  112.             var k_UINT64 = Keyword("uint64");
  113.             var k_VOID = Keyword("void");
  114.             var k_WHILE = Keyword("while");
  115.             var k_XOR = Keyword("xor");
  116.  
  117.             #endregion
  118.  
  119.             var NUMBER = CreateAngelScriptNumber("number"); // new NumberLiteral("number");// new NonTerminal("number");                 // ::= single token:  includes integers and real numbers, same as C++
  120.             var STRING = new StringLiteral("string", "\"");//new NonTerminal("string");                 // ::= single token:  single quoted ', double quoted ", or heredoc multi-line string """
  121.             var BITS = new NumberLiteral("bits");//new NonTerminal("bits");                     // ::= single token:  binary 0b or 0B, octal 0o or 0O, decimal 0d or 0D, hexadecimal 0x or 0X
  122.             var IDENTIFIER = new IdentifierTerminal("identifier");
  123.  
  124.             var SCOPE_0_opt_0_opt = new NonTerminal("scope_0_opt_0_opt");
  125.             var SCOPE_0_opt_1 = new NonTerminal("scope_0_opt_1");
  126.             var SCOPE_0_opt_1_list = new NonTerminal("scope_0_opt_1_list");
  127.             var SCOPE_0_opt = new NonTerminal("scope_0_opt");
  128.             var SCOPE = new NonTerminal("scope");
  129.             var TYPEMOD_0_opt_0_opt = new NonTerminal("typemod_0_opt_0_opt");
  130.             var TYPEMOD_0_opt = new NonTerminal("typemod_0_opt");
  131.             var TYPEMOD = new NonTerminal("typemod");
  132.             var TYPE_0_opt = new NonTerminal("type_0_opt");
  133.             var TYPE_1_opt_0 = new NonTerminal("type_1_opt_0");
  134.             var TYPE_1_opt_0_list = new NonTerminal("type_1_opt_0_list");
  135.             var TYPE_1_opt = new NonTerminal("type_1_opt");
  136.             var TYPE_2 = new NonTerminal("type_2");
  137.             var TYPE_2_list = new NonTerminal("type_2_list");
  138.             var TYPE = new NonTerminal("type");
  139.             var DATATYPE = new NonTerminal("datatype");
  140.             var PRIMTYPE = new NonTerminal("primtype");
  141.             var PARAMLIST_0_opt = new NonTerminal("paramlist_0_opt");
  142.             var PARAMLIST_1_opt = new NonTerminal("paramlist_1_opt");
  143.             var PARAMLIST_2_list_0_opt = new NonTerminal("paramlist_2_list_0_opt");
  144.             var PARAMLIST_2_list_1_opt = new NonTerminal("paramlist_2_list_1_opt");
  145.             var PARAMLIST_2 = new NonTerminal("paramlist_2");
  146.             var PARAMLIST_2_list = new NonTerminal("paramlist_2_list");
  147.             var PARAMLIST = new NonTerminal("paramlist");
  148.             var CAST = new NonTerminal("cast");
  149.             var EXPRVALUE = new NonTerminal("exprvalue");
  150.             var LITERAL = new NonTerminal("literal");
  151.             var FUNCCALL = new NonTerminal("funccall");
  152.             var VARACCESS = new NonTerminal("varaccess");
  153.             var CONSTRUCTCALL = new NonTerminal("constructcall");
  154.             var ARGLIST_0_opt = new NonTerminal("arglist_0_opt");
  155.             var ARGLIST_1_list_0_opt = new NonTerminal("arglist_1_list_0_opt");
  156.             var ARGLIST_1 = new NonTerminal("arglist_1");
  157.             var ARGLIST_1_list = new NonTerminal("arglist_1_list");
  158.             var ARGLIST = new NonTerminal("arglist");
  159.             var ASSIGN_0_opt = new NonTerminal("assign_0_opt");
  160.             var ASSIGN = new NonTerminal("assign");
  161.             var CONDITION_0_opt = new NonTerminal("condition_0_opt");
  162.             var CONDITION = new NonTerminal("condition");
  163.             var EXPR_0 = new NonTerminal("expr_0");
  164.             var EXPR_0_list = new NonTerminal("expr_0_list");
  165.             var EXPR = new NonTerminal("expr");
  166.             var EXPRTERM_0 = new NonTerminal("exprterm_0");
  167.             var EXPRTERM_0_list = new NonTerminal("exprterm_0_list");
  168.             var EXPRTERM_1 = new NonTerminal("exprterm_1");
  169.             var EXPRTERM_1_list = new NonTerminal("exprterm_1_list");
  170.             var EXPRTERM = new NonTerminal("exprterm");
  171.             var EXPRPREOP = new NonTerminal("exprpreop");
  172.             var EXPRPOSTOP_0_opt = new NonTerminal("exprpostop_0_opt");
  173.             var EXPRPOSTOP_1_list_0_opt = new NonTerminal("exprpostop_1_list_0_opt");
  174.             var EXPRPOSTOP_1 = new NonTerminal("exprpostop_1");
  175.             var EXPRPOSTOP_1_list = new NonTerminal("exprpostop_1_list");
  176.             var EXPRPOSTOP = new NonTerminal("exprpostop");
  177.             var EXPROP = new NonTerminal("exprop");
  178.             var MATHOP = new NonTerminal("mathop");
  179.             var COMPOP = new NonTerminal("compop");
  180.             var LOGICOP = new NonTerminal("logicop");
  181.             var BITOP = new NonTerminal("bitop");
  182.             var ASSIGNOP = new NonTerminal("assignop");
  183.             var IMPORT_0_opt = new NonTerminal("import_0_opt");
  184.             var IMPORT = new NonTerminal("import");
  185.             var SCRIPT_0 = new NonTerminal("script_0");
  186.             var SCRIPT_0_list = new NonTerminal("script_0_list");
  187.             var SCRIPT = new NonTerminal("script");
  188.             var NAMESPACE = new NonTerminal("namespace");
  189.             var ENUM_0_opt = new NonTerminal("enum_0_opt");
  190.             var ENUM_1_opt = new NonTerminal("enum_1_opt");
  191.             var ENUM_2_list_0_opt = new NonTerminal("enum_2_list_0_opt");
  192.             var ENUM_2 = new NonTerminal("enum_2");
  193.             var ENUM_2_list = new NonTerminal("enum_2_list");
  194.             var ENUM = new NonTerminal("enum");
  195.             var FUNCDEF_0_opt = new NonTerminal("funcdef_0_opt");
  196.             var FUNCDEF = new NonTerminal("funcdef");
  197.             var FUNC_0_opt = new NonTerminal("func_0_opt");
  198.             var FUNC_1_opt_0_opt = new NonTerminal("func_1_opt_0_opt");
  199.             var FUNC_1_opt = new NonTerminal("func_1_opt");
  200.             var FUNC_2_opt = new NonTerminal("func_2_opt");
  201.             var FUNC_3 = new NonTerminal("func_3");
  202.             var FUNC_3_list = new NonTerminal("func_3_list");
  203.             var FUNC = new NonTerminal("func");
  204.             var INTFMTHD_0_opt = new NonTerminal("intfmthd_0_opt");
  205.             var INTFMTHD_1_opt = new NonTerminal("intfmthd_1_opt");
  206.             var INTFMTHD = new NonTerminal("intfmthd");
  207.             var VIRTPROP_0_opt = new NonTerminal("virtprop_0_opt");
  208.             var VIRTPROP_1_opt = new NonTerminal("virtprop_1_opt");
  209.             var VIRTPROP_2_list_0_opt = new NonTerminal("virtprop_2_list_0_opt");
  210.             var VIRTPROP_2_list_1_opt = new NonTerminal("virtprop_2_list_1_opt");
  211.             var VIRTPROP_2 = new NonTerminal("virtprop_2");
  212.             var VIRTPROP_2_list = new NonTerminal("virtprop_2_list");
  213.             var VIRTPROP = new NonTerminal("virtprop");
  214.             var INTERFACE_0_opt = new NonTerminal("interface_0_opt");
  215.             var INTERFACE_1_opt_0 = new NonTerminal("interface_1_opt_0");
  216.             var INTERFACE_1_opt_0_list = new NonTerminal("interface_1_opt_0_list");
  217.             var INTERFACE_1_opt = new NonTerminal("interface_1_opt");
  218.             var INTERFACE_2 = new NonTerminal("interface_2");
  219.             var INTERFACE_2_list = new NonTerminal("interface_2_list");
  220.             var INTERFACE = new NonTerminal("interface");
  221.             var MIXIN = new NonTerminal("mixin");
  222.             var CLASS_0 = new NonTerminal("class_0");
  223.             var CLASS_0_list = new NonTerminal("class_0_list");
  224.             var CLASS_1_opt_0 = new NonTerminal("class_1_opt_0");
  225.             var CLASS_1_opt_0_list = new NonTerminal("class_1_opt_0_list");
  226.             var CLASS_1_opt = new NonTerminal("class_1_opt");
  227.             var CLASS_2 = new NonTerminal("class_2");
  228.             var CLASS_2_list = new NonTerminal("class_2_list");
  229.             var CLASS = new NonTerminal("class");
  230.             var STATBLOCK_0 = new NonTerminal("statblock_0");
  231.             var STATBLOCK_0_list = new NonTerminal("statblock_0_list");
  232.             var STATBLOCK = new NonTerminal("statblock");
  233.             var INITLIST_0_opt = new NonTerminal("initlist_0_opt");
  234.             var INITLIST_1_list_0_opt = new NonTerminal("initlist_1_list_0_opt");
  235.             var INITLIST_1 = new NonTerminal("initlist_1");
  236.             var INITLIST_1_list = new NonTerminal("initlist_1_list");
  237.             var INITLIST = new NonTerminal("initlist");
  238.             var VAR_0_opt = new NonTerminal("var_0_opt");
  239.             var VAR_1_opt = new NonTerminal("var_1_opt");
  240.             var VAR_2_list_0_opt = new NonTerminal("var_2_list_0_opt");
  241.             var VAR_2 = new NonTerminal("var_2");
  242.             var VAR_2_list = new NonTerminal("var_2_list");
  243.             var VAR = new NonTerminal("var");
  244.             var STATEMENT = new NonTerminal("statement");
  245.             var EXPRSTAT_0_opt = new NonTerminal("exprstat_0_opt");
  246.             var EXPRSTAT = new NonTerminal("exprstat");
  247.             var SWITCH_0 = new NonTerminal("switch_0");
  248.             var SWITCH_0_list = new NonTerminal("switch_0_list");
  249.             var SWITCH = new NonTerminal("switch");
  250.             var CASE_0 = new NonTerminal("case_0");
  251.             var CASE_0_list = new NonTerminal("case_0_list");
  252.             var CASE = new NonTerminal("case");
  253.             var IF_0_opt = new NonTerminal("if_0_opt");
  254.             var IF = new NonTerminal("if");
  255.             var FOR_0_opt = new NonTerminal("for_0_opt");
  256.             var FOR = new NonTerminal("for");
  257.             var WHILE = new NonTerminal("while");
  258.             var DOWHILE = new NonTerminal("dowhile");
  259.             var RETURN_0_opt = new NonTerminal("return_0_opt");
  260.             var RETURN = new NonTerminal("return");
  261.             var BREAK = new NonTerminal("break");
  262.             var CONTINUE = new NonTerminal("continue");
  263.             var TYPEDEF = new NonTerminal("typedef");
  264.  
  265.             this.Root = SCRIPT;
  266.  
  267.             SCOPE_0_opt_0_opt.Rule = Empty | IDENTIFIER;
  268.             SCOPE_0_opt_1.Rule = IDENTIFIER + "::";
  269.             SCOPE_0_opt_1_list.Rule = MakeStarRule(SCOPE_0_opt_1_list, null, SCOPE_0_opt_1);
  270.             SCOPE_0_opt.Rule = Empty | SCOPE_0_opt_0_opt + "::" + SCOPE_0_opt_1_list;
  271.  
  272.             // SCOPE ::=  [[IDENTIFIER] '::' {IDENTIFIER '::'}]
  273.             SCOPE.Rule = SCOPE_0_opt;
  274.  
  275.             TYPEMOD_0_opt_0_opt.Rule = Empty | "in" | "out" | "inout";
  276.             TYPEMOD_0_opt.Rule = Empty | "&" + TYPEMOD_0_opt_0_opt;
  277.  
  278.             // TYPEMOD ::=  ['&' ['in' | 'out' | 'inout']]
  279.             TYPEMOD.Rule = TYPEMOD_0_opt;
  280.  
  281.             TYPE_0_opt.Rule = Empty | "const";
  282.             TYPE_1_opt_0.Rule = "," + TYPE;
  283.             TYPE_1_opt_0_list.Rule = MakeStarRule(TYPE_1_opt_0_list, null, TYPE_1_opt_0);
  284.             TYPE_1_opt.Rule = Empty | "<" + TYPE + TYPE_1_opt_0_list + ">";
  285.             TYPE_2.Rule = (ToTerm("[") + "]") | "@";
  286.             TYPE_2_list.Rule = MakeStarRule(TYPE_2_list, null, TYPE_2);
  287.  
  288.             // TYPE ::=  ['const'] SCOPE DATATYPE ['<' TYPE {',' TYPE} '>'] { ('[' ']') | '@' }
  289.             TYPE.Rule = TYPE_0_opt + SCOPE + DATATYPE + TYPE_1_opt + TYPE_2_list;
  290.            
  291.             // DATATYPE ::=  (IDENTIFIER | PRIMTYPE | '?' | 'auto')
  292.             DATATYPE.Rule = (PRIMTYPE | "?" | "auto" | IDENTIFIER);
  293.            
  294.             // PRIMTYPE ::=  'void' | 'int' | 'int8' | 'int16' | 'int32' | 'int64' | 'uint' | 'uint8' | 'uint16' | 'uint32' | 'uint64' | 'float' | 'double' | 'bool'
  295.             PRIMTYPE.Rule = ToTerm("void") | "int8" | "int16" | "int32" | "int64" | "int" | "uint8" | "uint16" | "uint32" | "uint64" | "uint" | "float" | "double" | "bool";
  296.  
  297.             PARAMLIST_0_opt.Rule = Empty | IDENTIFIER;
  298.             PARAMLIST_1_opt.Rule = Empty | "=" + EXPR;
  299.             PARAMLIST_2_list_0_opt.Rule = Empty | IDENTIFIER;
  300.             PARAMLIST_2_list_1_opt.Rule = Empty | "=" + EXPR;
  301.             PARAMLIST_2.Rule = "," + TYPE + TYPEMOD + PARAMLIST_2_list_0_opt + PARAMLIST_2_list_1_opt;
  302.             PARAMLIST_2_list.Rule = MakeStarRule(PARAMLIST_2_list, null, PARAMLIST_2);
  303.  
  304.             // PARAMLIST ::=  '(' ('void' | (TYPE TYPEMOD [IDENTIFIER] ['=' EXPR] {',' TYPE TYPEMOD [IDENTIFIER] ['=' EXPR]}) ')'
  305.             PARAMLIST.Rule = "(" + ("void" | (TYPE + TYPEMOD + PARAMLIST_0_opt + PARAMLIST_1_opt + PARAMLIST_2_list)) + ")";
  306.            
  307.             // CAST ::=  'cast' '<' TYPE '>' '(' ASSIGN ')'
  308.             CAST.Rule = "cast" + "<" + TYPE + ">" + "(" + ASSIGN + ")";
  309.            
  310.             // EXPRVALUE ::=  'void' | CONSTRUCTCALL | FUNCCALL | VARACCESS | CAST | LITERAL | '(' ASSIGN ')'
  311.             EXPRVALUE.Rule = "void" | CONSTRUCTCALL | FUNCCALL | VARACCESS | CAST | LITERAL | "(" + ASSIGN + ")";
  312.            
  313.             // LITERAL ::=  NUMBER | STRING | BITS | 'true' | 'false' | 'null'
  314.             LITERAL.Rule = NUMBER | STRING | BITS | "true" | "false" | "null";
  315.            
  316.             // FUNCCALL ::=  SCOPE IDENTIFIER ARGLIST
  317.             FUNCCALL.Rule = SCOPE + IDENTIFIER + ARGLIST;
  318.            
  319.             // VARACCESS ::=  SCOPE IDENTIFIER
  320.             VARACCESS.Rule = SCOPE + IDENTIFIER;
  321.            
  322.             // CONSTRUCTCALL ::=  TYPE ARGLIST
  323.             CONSTRUCTCALL.Rule = TYPE + ARGLIST;
  324.  
  325.             ARGLIST_0_opt.Rule = Empty | IDENTIFIER + ":";
  326.             ARGLIST_1_list_0_opt.Rule = Empty | IDENTIFIER + ":";
  327.             ARGLIST_1.Rule = "," + ARGLIST_1_list_0_opt + ASSIGN;
  328.             ARGLIST_1_list.Rule = MakeStarRule(ARGLIST_1_list, null, ARGLIST_1);
  329.  
  330.             // ARGLIST ::=  '(' [IDENTIFIER ':'] ASSIGN {',' [IDENTIFIER ':'] ASSIGN} ')'
  331.             ARGLIST.Rule = "(" + ARGLIST_0_opt + ASSIGN + ARGLIST_1_list + ")";
  332.  
  333.             ASSIGN_0_opt.Rule = Empty | ASSIGNOP + ASSIGN;
  334.  
  335.             // ASSIGN ::=  CONDITION [ ASSIGNOP ASSIGN ]
  336.             ASSIGN.Rule = CONDITION + ASSIGN_0_opt;
  337.  
  338.             CONDITION_0_opt.Rule = Empty | "?" + ASSIGN + ":" + ASSIGN;
  339.  
  340.             // CONDITION ::=  EXPR ['?' ASSIGN ':' ASSIGN]
  341.             CONDITION.Rule = EXPR + CONDITION_0_opt;
  342.  
  343.             EXPR_0.Rule = EXPROP + EXPRTERM;
  344.             EXPR_0_list.Rule = MakeStarRule(EXPR_0_list, null, EXPR_0);
  345.  
  346.             // EXPR ::=  (TYPE '=' INILIST) | (EXPRTERM {EXPROP EXPRTERM})
  347.             EXPR.Rule = (TYPE + "=" + INITLIST) | (EXPRTERM + EXPR_0_list);
  348.  
  349.             EXPRTERM_0.Rule = EXPRPREOP;
  350.             EXPRTERM_0_list.Rule = MakeStarRule(EXPRTERM_0_list, null, EXPRTERM_0);
  351.             EXPRTERM_1.Rule = EXPRPOSTOP;
  352.             EXPRTERM_1_list.Rule = MakeStarRule(EXPRTERM_1_list, null, EXPRTERM_1);
  353.  
  354.             // EXPRTERM ::=  {EXPRPREOP} EXPRVALUE {EXPRPOSTOP}
  355.             EXPRTERM.Rule = EXPRTERM_0_list + EXPRVALUE + EXPRTERM_1_list;
  356.            
  357.             // EXPRPREOP ::=  '-' | '+' | '!' | '++' | '--' | '~' | '@'
  358.             EXPRPREOP.Rule = ToTerm("-") | "+" | "!" | "++" | "--" | "~" | "@";
  359.  
  360.             EXPRPOSTOP_0_opt.Rule = Empty | IDENTIFIER + ":";
  361.             EXPRPOSTOP_1_list_0_opt.Rule = Empty | IDENTIFIER + ":";
  362.             EXPRPOSTOP_1.Rule = "," + EXPRPOSTOP_1_list_0_opt + ASSIGN;
  363.             EXPRPOSTOP_1_list.Rule = MakeStarRule(EXPRPOSTOP_1_list, null, EXPRPOSTOP_1);
  364.  
  365.             // EXPRPOSTOP ::=  ('.' (FUNCCALL | IDENTIFIER)) | ('[' [IDENTIFIER ':'] ASSIGN {',' [IDENTIFIER ':'] ASSIGN} ']') | ARGLIST | '++' | '--'
  366.             EXPRPOSTOP.Rule = ("." + (FUNCCALL | IDENTIFIER)) | ("[" + EXPRPOSTOP_0_opt + ASSIGN + EXPRPOSTOP_1_list + "]") | ARGLIST | "++" | "--";
  367.            
  368.             // EXPROP ::=  MATHOP | COMPOP | LOGICOP | BITOP
  369.             EXPROP.Rule = MATHOP | COMPOP | LOGICOP | BITOP;
  370.            
  371.             // MATHOP ::=  '+' | '-' | '*' | '/' | '%' | '**'
  372.             MATHOP.Rule = ToTerm("+") | "-" | "/" | "%" | "**" | "*";
  373.            
  374.             // COMPOP ::=  '==' | '!=' | '<' | '<=' | '>' | '>=' | 'is' | '!is'
  375.             COMPOP.Rule = ToTerm("==") | "!=" | "<=" | "<" | ">=" | ">" | "is" | "!is";
  376.            
  377.             // LOGICOP ::=  '&&' | '||' | '^^' | 'and' | 'or' | 'xor'
  378.             LOGICOP.Rule = ToTerm("&&") | "||" | "^^" | "and" | "or" | "xor";
  379.            
  380.             // BITOP ::=  '&' | '|' | '^' | '<<' | '>>' | '>>>'
  381.             BITOP.Rule = ToTerm("&") | "|" | "^" | "<<" | ">>>" | ">>";
  382.            
  383.             // ASSIGNOP ::=  '=' | '+=' | '-=' | '*=' | '/=' | '|=' | '&=' | '^=' | '%=' | '**=' | '<<=' | '>>=' | '>>>='
  384.             ASSIGNOP.Rule = ToTerm("=") | "+=" | "-=" | "/=" | "|=" | "&=" | "^=" | "%=" | "**=" | "*=" | "<<=" | ">>>=" | ">>=";
  385.  
  386.             IMPORT_0_opt.Rule = Empty | "&";
  387.  
  388.             // IMPORT ::=  'import' TYPE ['&'] IDENTIFIER PARAMLIST 'from' STRING ';'
  389.             IMPORT.Rule = "import" + TYPE + IMPORT_0_opt + IDENTIFIER + PARAMLIST + "from" + STRING + ";";
  390.  
  391.             SCRIPT_0.Rule = IMPORT | ENUM | TYPEDEF | CLASS | MIXIN | INTERFACE | FUNCDEF | VIRTPROP | FUNC | VAR | NAMESPACE | ";";
  392.             SCRIPT_0_list.Rule = MakeStarRule(SCRIPT_0_list, null, SCRIPT_0);
  393.  
  394.             // SCRIPT ::=  {IMPORT | ENUM | TYPEDEF | CLASS | MIXIN | INTERFACE | FUNCDEF | VIRTPROP | VAR | FUNC | NAMESPACE | ';'}
  395.             SCRIPT.Rule = SCRIPT_0_list;
  396.            
  397.             // NAMESPACE ::=  'namespace' IDENTIFIER '{' SCRIPT '}'
  398.             NAMESPACE.Rule = "namespace" + IDENTIFIER + "{" + SCRIPT + "}";
  399.  
  400.             ENUM_0_opt.Rule = Empty | "shared";
  401.             ENUM_1_opt.Rule = Empty | "=" + EXPR;
  402.             ENUM_2_list_0_opt.Rule = Empty | "=" + EXPR;
  403.             ENUM_2.Rule = "," + IDENTIFIER + ENUM_2_list_0_opt;
  404.             ENUM_2_list.Rule = MakeStarRule(ENUM_2_list, null, ENUM_2);
  405.  
  406.             // ENUM ::=  ['shared'] 'enum' IDENTIFIER '{' IDENTIFIER ['=' EXPR] {',' IDENTIFIER ['=' EXPR]} '}'
  407.             ENUM.Rule = ENUM_0_opt + "enum" + IDENTIFIER + "{" + IDENTIFIER + ENUM_1_opt + ENUM_2_list + "}";
  408.  
  409.             FUNCDEF_0_opt.Rule = Empty | "&";
  410.  
  411.             // FUNCDEF ::=  'funcdef' TYPE ['&'] IDENTIFIER PARAMLIST ';'
  412.             FUNCDEF.Rule = "funcdef" + TYPE + FUNCDEF_0_opt + IDENTIFIER + PARAMLIST + ";";
  413.  
  414.             FUNC_0_opt.Rule = Empty | "private" | "protected" | "shared";
  415.             FUNC_1_opt_0_opt.Rule = Empty | "&";
  416.             FUNC_1_opt.Rule = Empty | ((TYPE + FUNC_1_opt_0_opt) | "~");
  417.             FUNC_2_opt.Rule = Empty | "const";
  418.             FUNC_3.Rule = ToTerm("override") | "final";
  419.             FUNC_3_list.Rule = MakeStarRule(FUNC_3_list, null, FUNC_3);
  420.  
  421.             // FUNC ::=  ['private' | 'protected' | 'shared'] [((TYPE ['&']) | '~')] IDENTIFIER PARAMLIST ['const'] {'override' | 'final'} STATBLOCK
  422.             FUNC.Rule = FUNC_0_opt + FUNC_1_opt + IDENTIFIER + PARAMLIST + FUNC_2_opt + FUNC_3_list + STATBLOCK;
  423.  
  424.             INTFMTHD_0_opt.Rule = Empty | "&";
  425.             INTFMTHD_1_opt.Rule = Empty | "const";
  426.  
  427.             // INTFMTHD ::=  TYPE ['&'] IDENTIFIER PARAMLIST ['const'] ';'
  428.             INTFMTHD.Rule = TYPE + INTFMTHD_0_opt + IDENTIFIER + PARAMLIST + INTFMTHD_1_opt + ";";
  429.  
  430.             VIRTPROP_0_opt.Rule = Empty | "private" | "protected";
  431.             VIRTPROP_1_opt.Rule = Empty | "&";
  432.             VIRTPROP_2_list_0_opt.Rule = Empty | "const";
  433.             VIRTPROP_2_list_1_opt.Rule = Empty | (ToTerm("override") | "final");
  434.             VIRTPROP_2.Rule = (ToTerm("get") | "set") + VIRTPROP_2_list_0_opt + VIRTPROP_2_list_1_opt + (STATBLOCK | ";");
  435.             VIRTPROP_2_list.Rule = MakeStarRule(VIRTPROP_2_list, null, VIRTPROP_2);
  436.  
  437.             // VIRTPROP ::=  ['private' | 'protected'] TYPE ['&'] IDENTIFIER '{' {('get' | 'set') ['const'] [('override' | 'final')] (STATBLOCK | ';')} '}'
  438.             VIRTPROP.Rule = VIRTPROP_0_opt + TYPE + VIRTPROP_1_opt + IDENTIFIER + "{" + VIRTPROP_2_list + "}";
  439.  
  440.             INTERFACE_0_opt.Rule = Empty | "shared";
  441.             INTERFACE_1_opt_0.Rule = "," + IDENTIFIER;
  442.             INTERFACE_1_opt_0_list.Rule = MakeStarRule(INTERFACE_1_opt_0_list, null, INTERFACE_1_opt_0);
  443.             INTERFACE_1_opt.Rule = Empty | ":" + IDENTIFIER + INTERFACE_1_opt_0_list;
  444.             INTERFACE_2.Rule = VIRTPROP | INTFMTHD;
  445.             INTERFACE_2_list.Rule = MakeStarRule(INTERFACE_2_list, null, INTERFACE_2);
  446.  
  447.             // INTERFACE ::=  ['shared'] 'interface' IDENTIFIER [':' IDENTIFIER {',' IDENTIFIER}] '{' {VIRTPROP | INTFMTHD} '}'
  448.             INTERFACE.Rule = INTERFACE_0_opt + "interface" + IDENTIFIER + INTERFACE_1_opt + "{" + INTERFACE_2_list + "}";
  449.            
  450.             // MIXIN ::=  'mixin' CLASS
  451.             MIXIN.Rule = "mixin" + CLASS;
  452.  
  453.             CLASS_0.Rule = ToTerm("shared") | "abstract" | "final";
  454.             CLASS_0_list.Rule = MakeStarRule(CLASS_0_list, null, CLASS_0);
  455.             CLASS_1_opt_0.Rule = "," + IDENTIFIER;
  456.             CLASS_1_opt_0_list.Rule = MakeStarRule(CLASS_1_opt_0_list, null, CLASS_1_opt_0);
  457.             CLASS_1_opt.Rule = Empty | ":" + IDENTIFIER + CLASS_1_opt_0_list;
  458.             CLASS_2.Rule = VIRTPROP | FUNC | VAR;
  459.             CLASS_2_list.Rule = MakeStarRule(CLASS_2_list, null, CLASS_2);
  460.  
  461.             // CLASS ::=  {'shared' | 'abstract' | 'final'} 'class' IDENTIFIER [':' IDENTIFIER {',' IDENTIFIER}] '{' {VIRTPROP | FUNC | VAR} '}'
  462.             CLASS.Rule = CLASS_0_list + "class" + IDENTIFIER + CLASS_1_opt + "{" + CLASS_2_list + "}";
  463.  
  464.             STATBLOCK_0.Rule = VAR | STATEMENT;
  465.             STATBLOCK_0_list.Rule = MakeStarRule(STATBLOCK_0_list, null, STATBLOCK_0);
  466.  
  467.             // STATBLOCK ::=  '{' {VAR | STATEMENT} '}'
  468.             STATBLOCK.Rule = "{" + STATBLOCK_0_list + "}";
  469.  
  470.             INITLIST_0_opt.Rule = Empty | ASSIGN | INITLIST;
  471.             INITLIST_1_list_0_opt.Rule = Empty | ASSIGN | INITLIST;
  472.             INITLIST_1.Rule = "," + INITLIST_1_list_0_opt;
  473.             INITLIST_1_list.Rule = MakeStarRule(INITLIST_1_list, null, INITLIST_1);
  474.  
  475.             // INITLIST ::=  '{' [ASSIGN | INITLIST] {',' [ASSIGN | INITLIST]} '}'
  476.             INITLIST.Rule = "{" + INITLIST_0_opt + INITLIST_1_list + "}";
  477.  
  478.             VAR_0_opt.Rule = Empty | "private" | "protected";
  479.             VAR_1_opt.Rule = Empty | (ToTerm("=") + (INITLIST | EXPR)) | ARGLIST;
  480.             VAR_2_list_0_opt.Rule = Empty | (ToTerm("=") + (INITLIST | EXPR)) | ARGLIST;
  481.             VAR_2.Rule = "," + IDENTIFIER + VAR_2_list_0_opt;
  482.             VAR_2_list.Rule = MakeStarRule(VAR_2_list, null, VAR_2);
  483.  
  484.             // VAR ::=  ['private'|'protected'] TYPE IDENTIFIER [( '=' (INITLIST | EXPR)) | ARGLIST] {',' IDENTIFIER [( '=' (INITLIST | EXPR)) | ARGLIST]} ';'
  485.             VAR.Rule = VAR_0_opt + TYPE + IDENTIFIER + VAR_1_opt + VAR_2_list + ";";
  486.            
  487.             // STATEMENT ::=  (IF | FOR | WHILE | RETURN | STATBLOCK | BREAK | CONTINUE | DOWHILE | SWITCH | EXPRSTAT)
  488.             STATEMENT.Rule = (IF | FOR | WHILE | RETURN | STATBLOCK | BREAK | CONTINUE | DOWHILE | SWITCH | EXPRSTAT);
  489.  
  490.             EXPRSTAT_0_opt.Rule = Empty | ASSIGN;
  491.  
  492.             // EXPRSTAT ::=  [ASSIGN] ';'
  493.             EXPRSTAT.Rule = EXPRSTAT_0_opt + ";";
  494.  
  495.             SWITCH_0.Rule = CASE;
  496.             SWITCH_0_list.Rule = MakeStarRule(SWITCH_0_list, null, SWITCH_0);
  497.  
  498.             // SWITCH ::=  'switch' '(' ASSIGN ')' '{' {CASE} '}'
  499.             SWITCH.Rule = "switch" + "(" + ASSIGN + ")" + "{" + SWITCH_0_list + "}";
  500.  
  501.             CASE_0.Rule = STATEMENT;
  502.             CASE_0_list.Rule = MakeStarRule(CASE_0_list, null, CASE_0);
  503.  
  504.             // CASE ::=  (('case' EXPR) | 'default') ':' {STATEMENT}
  505.             CASE.Rule = (("case" + EXPR) | "default") + ":" + CASE_0_list;
  506.  
  507.             IF_0_opt.Rule = Empty | "else" + STATEMENT;
  508.  
  509.             // IF ::=  'if' '(' ASSIGN ')' STATEMENT ['else' STATEMENT]
  510.             IF.Rule = "if" + "(" + ASSIGN + ")" + STATEMENT + IF_0_opt;
  511.  
  512.             FOR_0_opt.Rule = Empty | ASSIGN;
  513.  
  514.             // FOR ::=  'for' '(' (VAR | EXPRSTAT) EXPRSTAT [ASSIGN] ')' STATEMENT
  515.             FOR.Rule = "for" + "(" + (VAR | EXPRSTAT) + EXPRSTAT + FOR_0_opt + ")" + STATEMENT;
  516.            
  517.             // WHILE ::=  'while' '(' ASSIGN ')' STATEMENT
  518.             WHILE.Rule = "while" + "(" + ASSIGN + ")" + STATEMENT;
  519.            
  520.             // DOWHILE ::=  'do' STATEMENT 'while' '(' ASSIGN ')' ';'
  521.             DOWHILE.Rule = "do" + STATEMENT + "while" + "(" + ASSIGN + ")" + ";";
  522.  
  523.             RETURN_0_opt.Rule = Empty | ASSIGN;
  524.  
  525.             // RETURN ::=  'return' [ASSIGN] ';'
  526.             RETURN.Rule = "return" + RETURN_0_opt + ";";
  527.            
  528.             // BREAK ::=  'break' ';'
  529.             BREAK.Rule = "break" + ";";
  530.            
  531.             // CONTINUE ::=  'continue' ';'
  532.             CONTINUE.Rule = "continue" + ";";
  533.            
  534.             // TYPEDEF ::=  'typedef' PRIMTYPE IDENTIFIER ';'
  535.             TYPEDEF.Rule = "typedef" + PRIMTYPE + IDENTIFIER + ";";
  536.            
  537.             this.RegisterBracePair("[", "]");
  538.             this.RegisterBracePair("<", ">");
  539.             this.RegisterBracePair("(", ")");
  540.             this.RegisterBracePair("{", "}");
  541.  
  542.             this.MarkPunctuation(",", ";", "(", ")", "{", "}");
  543.  
  544.             this.RegisterOperators(1, OpeOR);
  545.             this.RegisterOperators(2, OpeAND);
  546.             this.RegisterOperators(3, OpeBigEQ, OpeBig, OpeSm, OpeSmEQ, OpeNEQ, OpeEQ);
  547.             this.RegisterOperators(4, OpeAdd, OpeSub);
  548.             this.RegisterOperators(5, OpeMul, OpeDiv, OpePre);
  549.             this.RegisterOperators(6, OpeNOT);
  550.             this.RegisterOperators(7, Associativity.Right, OpePow);
  551.         }
  552.  
  553.         BnfExpression MakeStarRule(BnfTerm term)
  554.         {
  555.             var s = MakeStarRule(new NonTerminal(term.Name + "*"), term);
  556.             s.Name = term.Name + "**";
  557.             return s;
  558.         }
  559.  
  560.         BnfExpression MakeStarRule(string n, BnfTerm term)
  561.         {
  562.             var s = base.MakeStarRule(new NonTerminal(n + "*"), term);
  563.             s.Name = n + "**";
  564.             return s;
  565.         }
  566.  
  567.         BnfExpression Q(string n, BnfTerm terms)
  568.         {
  569.             var q = terms.Q();
  570.             q.Name = n + "?";
  571.             return q;
  572.         }
  573.  
  574.         //Must create new overrides here in order to support the "Operator" token color
  575.         public new void RegisterOperators(int precedence, params string[] opSymbols)
  576.         {
  577.             RegisterOperators(precedence, Associativity.Left, opSymbols);
  578.         }
  579.  
  580.         //Must create new overrides here in order to support the "Operator" token color
  581.         public new void RegisterOperators(int precedence, Associativity associativity, params string[] opSymbols)
  582.         {
  583.             foreach (string op in opSymbols)
  584.             {
  585.                 KeyTerm opSymbol = Operator(op);
  586.                 opSymbol.Precedence = precedence;
  587.                 opSymbol.Associativity = associativity;
  588.             }
  589.         }
  590.  
  591.         public KeyTerm Keyword(string keyword)
  592.         {
  593.             var term = ToTerm(keyword);
  594.             // term.SetOption(TermOptions.IsKeyword, true);
  595.             // term.SetOption(TermOptions.IsReservedWord, true);
  596.  
  597.             this.MarkReservedWords(keyword);
  598.             term.EditorInfo = new TokenEditorInfo(TokenType.Keyword, TokenColor.Keyword, TokenTriggers.None);
  599.  
  600.             return term;
  601.         }
  602.  
  603.         public KeyTerm Operator(string op)
  604.         {
  605.             string opCased = this.CaseSensitive ? op : op.ToLower();
  606.             var term = new KeyTerm(opCased, op);
  607.             //term.SetOption(TermOptions.IsOperator, true);
  608.  
  609.             term.EditorInfo = new TokenEditorInfo(TokenType.Operator, TokenColor.Keyword, TokenTriggers.None);
  610.  
  611.             return term;
  612.         }
  613.         protected static NumberLiteral CreateAngelScriptNumber(string name)
  614.         {
  615.             NumberLiteral term = new NumberLiteral(name, NumberOptions.AllowStartEndDot);
  616.             //default int types are Integer (32bit) -> LongInteger (BigInt); Try Int64 before BigInt: Better performance?
  617.             term.DefaultIntTypes = new TypeCode[] { TypeCode.Int32, TypeCode.Int64 };
  618.             term.DefaultFloatType = TypeCode.Double; // it is default
  619.             term.AddPrefix("0x", NumberOptions.Hex);
  620.             term.AddPrefix("0b", NumberOptions.Binary);
  621.             term.AddPrefix("0d", NumberOptions.IntOnly);
  622.             term.AddSuffix("f", TypeCode.Double);
  623.  
  624.             return term;
  625.         }
  626.     }
  627. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement