示例#1
0
        public ASLGrammar()
            : base(true)
        {
            var string_lit = TerminalFactory.CreateCSharpString("string");
            var number     = TerminalFactory.CreateCSharpNumber("number");
            var identifier = TerminalFactory.CreateCSharpIdentifier("identifier");
            var code       = new CustomTerminal("code", MatchCodeTerminal);

            var single_line_comment = new CommentTerminal("SingleLineComment", "//", "\r", "\n", "\u2085", "\u2028", "\u2029");
            var delimited_comment   = new CommentTerminal("DelimitedComment", "/*", "*/");

            NonGrammarTerminals.Add(single_line_comment);
            NonGrammarTerminals.Add(delimited_comment);

            var state     = new KeyTerm("state", "state");
            var init      = new KeyTerm("init", "init");
            var exit      = new KeyTerm("exit", "exit");
            var update    = new KeyTerm("update", "update");
            var start     = new KeyTerm("start", "start");
            var split     = new KeyTerm("split", "split");
            var reset     = new KeyTerm("reset", "reset");
            var startup   = new KeyTerm("startup", "startup");
            var shutdown  = new KeyTerm("shutdown", "shutdown");
            var isLoading = new KeyTerm("isLoading", "isLoading");
            var gameTime  = new KeyTerm("gameTime", "gameTime");
            var comma     = ToTerm(",", "comma");
            var semi      = ToTerm(";", "semi");

            var root        = new NonTerminal("root");
            var state_def   = new NonTerminal("stateDef");
            var version     = new NonTerminal("version");
            var state_list  = new NonTerminal("stateList");
            var method_list = new NonTerminal("methodList");
            var var_list    = new NonTerminal("varList");
            var var         = new NonTerminal("var");
            var module      = new NonTerminal("module");
            var method      = new NonTerminal("method");
            var offset_list = new NonTerminal("offsetList");
            var offset      = new NonTerminal("offset");
            var method_type = new NonTerminal("methodType");

            root.Rule        = state_list + method_list;
            version.Rule     = (comma + string_lit) | Empty;
            state_def.Rule   = state + "(" + string_lit + version + ")" + "{" + var_list + "}";
            state_list.Rule  = MakeStarRule(state_list, state_def);
            method_list.Rule = MakeStarRule(method_list, method);
            var_list.Rule    = MakeStarRule(var_list, semi, var);
            module.Rule      = (string_lit + comma) | Empty;
            var.Rule         = (identifier + identifier + ":" + module + offset_list) | Empty;
            method.Rule      = (method_type + "{" + code + "}") | Empty;
            offset_list.Rule = MakePlusRule(offset_list, comma, offset);
            offset.Rule      = number;
            method_type.Rule = init | exit | update | start | split | isLoading | gameTime | reset | startup | shutdown;

            Root = root;

            MarkTransient(var_list, method_list, offset, method_type);

            LanguageFlags = LanguageFlags.NewLineBeforeEOF;
        }
        public VASLGrammar() : base(true)
        {
            var code       = new CustomTerminal("code", MatchCodeTerminal);
            var stringLit  = TerminalFactory.CreateCSharpString("string");
            var identifier = TerminalFactory.CreateCSharpIdentifier("identifier");
            var number     = TerminalFactory.CreateCSharpNumber("number");

            number.Options |= NumberOptions.AllowSign;

            var singleLineComment = new CommentTerminal("SingleLineComment", "//", "\r", "\n", "\u2085", "\u2028", "\u2029");
            var delimitedComment  = new CommentTerminal("DelimitedComment", "/*", "*/");

            NonGrammarTerminals.Add(singleLineComment);
            NonGrammarTerminals.Add(delimitedComment);

            // Todo: Aliases

            var init      = new KeyTerm("init", "init");
            var exit      = new KeyTerm("exit", "exit");
            var update    = new KeyTerm("update", "update");
            var start     = new KeyTerm("start", "start");
            var split     = new KeyTerm("split", "split");
            var reset     = new KeyTerm("reset", "reset");
            var startup   = new KeyTerm("startup", "startup");
            var shutdown  = new KeyTerm("shutdown", "shutdown");
            var undoSplit = new KeyTerm("undoSplit", "undoSplit");
            var isLoading = new KeyTerm("isLoading", "isLoading");
            var gameTime  = new KeyTerm("gameTime", "gameTime");
            var comma     = ToTerm(",", "comma");
            var semi      = ToTerm(";", "semi");

            var root       = new NonTerminal("root");
            var version    = new NonTerminal("version");
            var methodList = new NonTerminal("methodList");
            var varList    = new NonTerminal("varList");
            var var        = new NonTerminal("var");
            var method     = new NonTerminal("method");
            var methodType = new NonTerminal("methodType");

            root.Rule       = methodList;
            version.Rule    = (comma + stringLit) | Empty;
            methodList.Rule = MakeStarRule(methodList, method);
            varList.Rule    = MakeStarRule(varList, semi, var);
            method.Rule     = (methodType + "{" + code + "}") | Empty;
            methodType.Rule = init | exit | update | start | split | isLoading | gameTime | reset | startup | shutdown | undoSplit;

            Root = root;

            MarkTransient(varList, methodList, methodType);

            LanguageFlags = LanguageFlags.NewLineBeforeEOF;
        }
        public ASLGrammar()
            : base(true)
        {
            var stringLit         = TerminalFactory.CreateCSharpString("string");
            var number            = TerminalFactory.CreateCSharpNumber("number");
            var identifier        = TerminalFactory.CreateCSharpIdentifier("identifier");
            var code              = new CustomTerminal("code", MatchCodeTerminal);
            var singleLineComment = new CommentTerminal("SingleLineComment", "//", "\r", "\n", "\u2085", "\u2028", "\u2029");
            var delimitedComment  = new CommentTerminal("DelimitedComment", "/*", "*/");

            NonGrammarTerminals.Add(singleLineComment);
            NonGrammarTerminals.Add(delimitedComment);

            var state     = new KeyTerm("state", "state");
            var start     = new KeyTerm("start", "start");
            var split     = new KeyTerm("split", "split");
            var reset     = new KeyTerm("reset", "reset");
            var isLoading = new KeyTerm("isLoading", "isLoading");
            var gameTime  = new KeyTerm("gameTime", "gameTime");
            var comma     = ToTerm(",", "comma");
            var semi      = ToTerm(";", "semi");

            var root       = new NonTerminal("root");
            var stateDef   = new NonTerminal("stateDef");
            var methodList = new NonTerminal("methodList");
            var varList    = new NonTerminal("varList");
            var var        = new NonTerminal("var");
            var method     = new NonTerminal("method");
            var offsetList = new NonTerminal("offsetList");
            var offset     = new NonTerminal("offset");
            var methodType = new NonTerminal("methodType");

            root.Rule       = stateDef + methodList;
            stateDef.Rule   = state + "(" + stringLit + ")" + "{" + varList + "}";
            methodList.Rule = MakeStarRule(methodList, method);
            varList.Rule    = MakeStarRule(varList, semi, var);
            var.Rule        = (identifier + identifier + ":" + stringLit + comma + offsetList) | Empty;
            method.Rule     = (methodType + "{" + code + "}") | Empty;
            offsetList.Rule = MakePlusRule(offsetList, comma, offset);
            offset.Rule     = number;
            methodType.Rule = start | split | isLoading | gameTime | reset;

            this.Root = root;

            MarkTransient(varList, methodList, offset, methodType);

            this.LanguageFlags = LanguageFlags.NewLineBeforeEOF;
        }
示例#4
0
        public ClarionGrammar() : base(false) //case insensitive
        {
            base.GrammarComments = "Clarion grammar for parsing Clarion sources.";

            //Terminals
            var comment = new CommentTerminal("comment", "!", "\n");

            this.NonGrammarTerminals.Add(comment);
            _comment = comment;
            var identifier = new IdentifierTerminal("identifier", ":", string.Empty);
            var label      = new IdentifierTerminal("label", ":", string.Empty);

            label.ValidateToken += label_ValidateToken;
            label.Priority       = TerminalPriority.High;
            //Clarion uses suffixes for identifying number base (bin, octal, hex) - unlike Irony's NumberLiteral which supports suffixes.
            // We treat all numbers as hexadecimal with optional sufffixes that don't mean anything. We "fix" the value in ValidateToken handler
            var number = new NumberLiteral("number");

            number.Options = NumberOptions.Hex | NumberOptions.DisableQuickParse;
            number.AddSuffix("b", TypeCode.Int64);
            number.AddSuffix("o", TypeCode.Int64);
            number.AddSuffix("h", TypeCode.Int64);
            number.ValidateToken += number_ValidateToken;

            var string_lit = new StringLiteral("string_lit", "'", StringOptions.AllowsDoubledQuote | StringOptions.NoEscapes);

            var comma = ToTerm(",");
            var not   = ToTerm("NOT");

            //Non-terminals
            var source_file = new NonTerminal("source_file");
            var main_file   = new NonTerminal("main_file");
            //whitespace - NewLine, Empty line, line with compiler directive, or line with end-tag of Compile(..) directive
            var wspace               = new NonTerminal("wspace");
            var ws_lines             = new NonTerminal("ws_lines");
            var ws_line              = new NonTerminal("ws_line");
            var compiler_dir         = new NonTerminal("compiler_dir");
            var compiler_dir_line    = new NonTerminal("compiler_dir_line");
            var cdir_compile_end_tag = new CustomTerminal("compile_end_tag", Match_compile_end_tag);

            var cdir_include         = new NonTerminal("cdir_include");
            var cdir_equate          = new NonTerminal("cdir_equate");
            var cdir_compile_omit    = new NonTerminal("cdir_compile_omit");
            var compile_or_omit      = new NonTerminal("compile_or_omit");
            var cdir_section         = new NonTerminal("cdir_section");
            var once_opt             = new NonTerminal("once_opt");
            var const_value          = new NonTerminal("const_value");
            var comma_expr_opt       = new NonTerminal("comma_expr_opt");
            var comma_string_lit_opt = new NonTerminal("comma_string_lit_opt");


            var member_file  = new NonTerminal("member_file");
            var file_hearder = new NonTerminal("file_header");

            var map           = new NonTerminal("map");
            var map_opt       = new NonTerminal("map_opt");
            var map_elem      = new NonTerminal("map_elem");
            var map_elem_list = new NonTerminal("map_elem_list");

            var proc_decl_list     = new NonTerminal("proc_decl_list");
            var proc_decl          = new NonTerminal("proc_decl");
            var proc_impl_list     = new NonTerminal("proc_impl_list");
            var proc_impl          = new NonTerminal("proc_impl");
            var data_decl_list     = new NonTerminal("data_decl_list");
            var data_decl_list_opt = new NonTerminal("data_decl_list_opt");
            var data_decl          = new NonTerminal("data_decl");
            var stmt_list          = new NonTerminal("stmt_list");
            var stmt_line          = new NonTerminal("stmt_line");
            var stmt        = new NonTerminal("stmt");
            var assign_stmt = new NonTerminal("assign_stmt");
            var expr        = new NonTerminal("expr");
            var expr_opt    = new NonTerminal("expr_opt");
            var bin_expr    = new NonTerminal("bin_expr");
            var bin_op      = new NonTerminal("bin_op");
            var fun_call    = new NonTerminal("fun_call");
            var par_expr    = new NonTerminal("par_expr");
            var expr_list   = new NonTerminal("expr_list");
            var term        = new NonTerminal("term");

            var module_decl    = new NonTerminal("module_decl");
            var module_header  = new NonTerminal("module_ref");
            var data_type      = new NonTerminal("data_type");
            var param_init_opt = new NonTerminal("param_init_opt");
            var type_args_opt  = new NonTerminal("type_args_opt");
            var type_arg_list  = new NonTerminal("type_arg_list");
            var type_arg       = new NonTerminal("type_arg");

            var label_opt          = new NonTerminal("label_opt");
            var param_list         = new NonTerminal("param_list");
            var param              = new NonTerminal("param");
            var param_list_par_opt = new NonTerminal("param_list_par_opt");
            var attr_list_tail_opt = new NonTerminal("attr_list_tail_opt");
            var attr_list          = new NonTerminal("attr_list");
            var attr_def           = new NonTerminal("attr_def");
            var return_line_opt    = new NonTerminal("return_line_opt");
            var end_line           = new NonTerminal("end_line");

            //Rules
            base.Root        = source_file;
            source_file.Rule = main_file | member_file;

            //whitespace - includes compiler directives
            wspace.Rule   = NewLine + ws_lines;// +ReduceHere();
            ws_lines.Rule = MakeStarRule(ws_lines, ws_line);
            ws_line.Rule  = compiler_dir | PreferShiftHere() + NewLine + ReduceHere();
            //compiler_dir_line.Rule = compiler_dir;
            compiler_dir.Rule         = cdir_include | cdir_equate | cdir_compile_omit | cdir_section | cdir_compile_end_tag;
            cdir_include.Rule         = ToTerm("INCLUDE") + "(" + string_lit + comma_string_lit_opt + ")" + once_opt;
            comma_string_lit_opt.Rule = Empty | comma + string_lit;
            once_opt.Rule             = comma + "ONCE" | Empty;
            cdir_equate.Rule          = //ShiftIf("EQUATE").ComesBefore(NewLine)  +
                                        label + "EQUATE" + "(" + const_value + ")";
            const_value.Rule       = number | string_lit;
            cdir_compile_omit.Rule = compile_or_omit + "(" + string_lit + comma_expr_opt + ")";
            comma_expr_opt.Rule    = Empty | comma + expr;
            cdir_section.Rule      = ToTerm("SECTION") + "(" + string_lit + ")";
            compile_or_omit.Rule   = ToTerm("COMPILE") | "OMIT";

            //File structure
            main_file.Rule = "PROGRAM" + wspace + map + data_decl_list_opt + wspace +
                             "CODE" + wspace + stmt_list + return_line_opt + proc_impl_list;
            member_file.Rule = "MEMBER" + wspace + map_opt + data_decl_list + proc_impl_list;

            //map
            map_opt.Rule       = map | Empty;
            map.Rule           = "MAP" + wspace + map_elem_list + end_line;
            map_elem_list.Rule = MakeStarRule(map_elem_list, wspace, map_elem);
            map_elem.Rule      = proc_decl | module_header;
            module_decl.Rule   = module_header + proc_decl_list + end_line;
            module_header.Rule = ToTerm("MODULE") + "(" + string_lit + ")" + wspace;

            proc_decl_list.Rule     = MakePlusRule(proc_decl_list, proc_decl);
            proc_decl.Rule          = label + "PROCEDURE" + param_list_par_opt + attr_list_tail_opt + wspace;
            param_list_par_opt.Rule = Empty | "(" + param_list + ")";
            param_list.Rule         = MakePlusRule(param_list, comma, param);
            param.Rule          = data_type + identifier + param_init_opt;
            param_init_opt.Rule = Empty | "=" + number;
            data_type.Rule      = identifier + type_args_opt;
            type_args_opt.Rule  = Empty | "(" + type_arg_list + ")";
            type_arg_list.Rule  = MakePlusRule(type_arg_list, comma, type_arg);
            type_arg.Rule       = number | identifier;

            attr_list_tail_opt.Rule = Empty | comma + attr_list;
            attr_list.Rule          = MakePlusRule(attr_list, comma, attr_def);
            attr_def.Rule           = identifier + param_list_par_opt;

            data_decl_list.Rule     = MakePlusRule(data_decl_list, data_decl);
            data_decl_list_opt.Rule = data_decl_list | Empty;
            data_decl.Rule          = identifier + data_type + wspace;

            proc_impl_list.Rule = MakeStarRule(proc_impl_list, proc_impl);
            proc_impl.Rule      = proc_decl + data_decl_list + "CODE" + wspace + stmt_list + return_line_opt + wspace;
            stmt_list.Rule      = MakeStarRule(stmt_list, stmt_line);
            stmt_line.Rule      = stmt + wspace;
            stmt.Rule           = assign_stmt | fun_call;
            assign_stmt.Rule    = identifier + "=" + expr;
            expr.Rule           = fun_call | par_expr | bin_expr | term;
            par_expr.Rule       = "(" + expr + ")";
            bin_expr.Rule       = expr + bin_op + expr;
            bin_op.Rule         = ToTerm("+") | "-" | "*" | "/" | "^" | "%"
                                  | "&"
                                  | "=" | "<" | ">" | "~=" | "~<" | "~>" | not + "=" | not + "<" | not + ">"
                                  | "<>" | "<=" | "=<" | ">=" | "=>"
                                  | "~" | not | "AND" | "OR" | "XOR";
            fun_call.Rule  = identifier + "(" + expr_list + ")";
            expr_list.Rule = MakeStarRule(expr_list, comma, expr);
            expr_opt.Rule  = expr | Empty;
            term.Rule      = identifier | number | string_lit;

            return_line_opt.Rule = "RETURN" + expr_opt | Empty;
            end_line.Rule        = "END" + NewLine | "." + NewLine;

            //operator precedence
            RegisterOperators(10, "OR", "XOR");
            RegisterOperators(20, "AND");

            RegisterOperators(50, "=", "<", ">", "~=", "~<", "~>", "<>", "<=", "=<", ">=", "=>");
            RegisterOperators(100, "+", "-");
            RegisterOperators(110, "*", "/", "%", "&");
            RegisterOperators(120, Associativity.Right, "^");
            RegisterOperators(130, not);
            RegisterOperators(130, "~");

            //punctuation, brace pairs, transient nodes
            MarkPunctuation("(", ")", ",");
            RegisterBracePair("(", ")");

            //Reserved words and special words
            var resWordList = "ACCEPT AND BEGIN BREAK BY CASE CHOOSE COMPILE CYCLE DO ELSE ELSIF END EXECUTE EXIT FUNCTION GOTO IF INCLUDE LOOP" +
                              " MEMBER NEW NOT NULL OF OMIT OR OROF PARENT PROCEDURE PROGRAM RETURN ROUTINE SECTION SELF THEN TIMES TO UNTIL WHILE XOR";

            this.MarkReservedWords(resWordList.Split(' '));
            var specialWordsList = "APPLICATION CLASS CODE DATA DETAIL FILE FOOTER FORM GROUP HEADER ITEM ITEMIZE JOIN MAP MENU MENUBAR" +
                                   " MODULE OLECONTROL OPTION QUEUE RECORD REPORT ROW SHEET TAB TABLE TOOLBAR VIEW WINDOW";

            //Initialize special words list (words that cannot be used as proc names); we'll later use them for verifying proc names
            SpecialWords = new HashSet <string>(StringComparer.InvariantCultureIgnoreCase);
            SpecialWords.UnionWith(specialWordsList.Split(' '));
        }