--[[ Copyright 2008 Victor Camps This file is part of epeg. Epeg is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Epeg 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 General Public License for more details. You should have received a copy of the GNU General Public License along with Foobar. If not, see . ]] -------------------------------------------------------------------------------- -- -- -- Plumbing -- -- -- -------------------------------------------------------------------------------- epeg = {} epeg_proxy = {} -- If we don't use a function to check against invalid function names, -- lua will just stop without any notice which is hard to track. function epeg_proxy.__index(table, key) if epeg[key] == nil then error("Called unknown function "..key..".\n") end return epeg[key] end -------------------------------------------------------------------------------- -- -- -- Mainfunctions -- -- -- -------------------------------------------------------------------------------- -- Reads a grammar from file filename and returns it. -- If unsuccessful, it returns false and prints errors to stdout. -- It is possible that it prints other informations to stdout. function epeg.read_grammar(filename) local file, input, error file, error = io.open(filename, 'r') if file == nil then io.write("Error: could not open ", filename, ".\nReason: ", error) return false end input = file:read('*a') file:close() if input == nil then io.write("Error: Could not read out of file or file is empty.") return false end local result -- Get ast from epeg. result = epeg.parse_text(epeg.grammar, input) if not result then return false end -- Refine ast to grammar. local r = result[1].name.string local grammar = { [0] = r } local ok = grammar for i,v in ipairs(result) do if grammar[v.name.string] then io.write("Error: Rule ", v.name.string, " redeclared at ", v.row, ":", v.column, ".\n") if not type(grammar[v.name.string]) == "bool" then io.write("Error: Original declaration at ", grammar[v.name.string].row, ":", grammar[v.name.string].column, ".\n") else grammar[v.name.string] = false end ok = false else grammar[v.name.string] = v end end if ok and not epeg.check(grammar) then ok = false end return ok end -- Parses a given text using the grammar and returns the specified ast -- for the grammar. function epeg.parse_text(grammar, text) local topnode = { ["position"] = 1, ["column"] = 0, ["row"] = 1, ["string"] = "" } local parser = { ["position"] = 1, ["column"] = 0, ["row"] = 1, ["to_parse"] = text, ["grammar"] = grammar, ["grabs"] = 0, ["anchor"] = {}, ["topnode"] = topnode, } setmetatable(parser, epeg_proxy) parsing = coroutine.create(epeg.run_rule) if not coroutine.resume(parsing, parser, grammar[grammar[0]], topnode) then return false end return topnode end -- Dumps the given grammar as a lua table to file 'filename'. If filename is -- nil, stdout is used. -- if name is nil, it writes return { ... instead of tablename = { -- returns true if success, else error string. -- works only correct on grammars. -- -- Note: is a specialized function to dump noncyclic tables. function epeg.dump_grammar(grammar, name, filename) local file, err if not filename then file = io.stdout else file, err = io.open(filename, "w") if not file then return err end end if type(name) ~= "string" then file:write("return {\n") else file:write(name, " = {\n") end epeg.dump_table(grammar, file, 1) file:write("}\n") return true end -------------------------------------------------------------------------------- -- -- -- Parsing -- -- -- -------------------------------------------------------------------------------- -- Returns the string which matches with the regex. The search start at the -- actual position in the input stream. if walk is NOT set, the position will -- be updated after a successfull match -- If plain is set to true, the regex is a normal string. -- returns false if the regex was not found. function epeg:read_next(regex, walk, plain) local start, length, char, row, column, position, to_parse position = self.position row = self.row column = self.column to_parse = self.to_parse start, stop = string.find(to_parse, regex, position, plain) if start == nil then return false end if start ~= position then io.write("Note: Regex ", regex, " does not match against the actual position. (position=", position,", row=", row, ", column=", column, ")\n") end -- update row/column/position if walk ~= false then for i = position, stop do char = string.sub(to_parse, position, position) if char == '\n' then row = row + 1 column = 0 -- tabs count as 4 whitespaces elseif char == '\t' then column = column + 4 else column = column + 1 end position = position + 1 end self.position = position self.row = row self.column = column end return string.sub(to_parse, start, stop) end -- Workhorse for transforming text to an ast with help of a grammar. -- Both used by read_grammar and parse_text. function epeg.run_rule(parser, rule, node, parent) local position = parser.position local row = parser.row local column = parser.column local string_old_length = #(node.string) local string_old = node.string local newnode = { ["position"] = position, ["column"] = column, ["row"] = row, ["string"] = "", ["parent"] = node } local result = false if rule.type.string == "Rule" then result = epeg.run_rule(parser, rule.rule, node) return result elseif rule.type.string == "Choice" then -- Only one list out of the selection has to match successfull. for rulename, subrule in ipairs(rule) do if epeg.run_rule(parser, subrule, node) then return true end end -- Failed. Resetting the parser gets handled at the end of the function. elseif rule.type.string == "List" then -- Every pattern in the list needs to succeed. If not, we have to -- reset the tree and parser to the state before we went through -- the list. -- To reset the tree, we use parser.anchor to store a reference to all -- newly created child nodes. If the rule fails, we can use this list to -- remove the newly added childs from our actual node. -- The parser gets reset at the end of the function. local oldanchor = parser.anchor local anchor = {} parser.anchor = anchor local worked = true for rulename, subrule in ipairs(rule) do if not epeg.run_rule(parser, subrule, node) then worked = false break end end parser.anchor = oldanchor if worked then return true end -- the rule failed and we have to remove every created child node from -- our node to clean the mess up. for i,v in ipairs(anchor) do if v ~= -1 then node[v] = nil end end anchor = nil elseif rule.type.string == "RuleName" then return epeg.run_rule(parser, parser.grammar[rule.name.string], node) elseif rule.type.string == "AnonymousFixedNode" then newnode.string = rule.grabs.string table.insert(node, newnode) table.insert(parser.anchor, #node) newnode.pindex = #node return true elseif rule.type.string == "AnonymousGrabbingNode" then table.insert(node, newnode) newnode.pindex = #node table.insert(parser.anchor, #node) if not epeg.run_rule(parser, rule.grabs, newnode) then table.remove(node) parser.anchor[#parser.anchor] = -1 return false end newnode.string = epeg.unescape_string(newnode.string) return true elseif rule.type.string == "FixedNode" then if node[rule.name.string] then epeg.print_table(node) epeg.print_table(rule) parser:error("Tried to add second node with same name ("..rule.name.string..") to parent node.") end node[rule.name.string] = newnode newnode.pindex = rule.name.string newnode.string = rule.grabs.string table.insert(parser.anchor, rule.name.string) return true elseif rule.type.string == "GrabbingNode" then if node[rule.name.string] then epeg.print_table(node) epeg.print_table(rule) parser:error("Tried to add second node with same name ("..rule.name.string..") to parent node.") end node[rule.name.string] = newnode newnode.pindex = rule.name.string table.insert(parser.anchor, rule.name.string) if not epeg.run_rule(parser, rule.grabs, newnode) then node[rule.name.string] = nil parser.anchor[#parser.anchor] = -1 return false end newnode.string = epeg.unescape_string(newnode.string) return true elseif rule.type.string == "CollectInput" then parser.grabs = parser.grabs + 1 result = epeg.run_rule(parser, rule.grabs, node) parser.grabs = parser.grabs - 1 return result elseif rule.type.string == "FunctionCall" then result = _G[rule["function"]["string"]](parser, node) if parent and parent.type.string == "Pattern" and parent.prefix then if parent.prefix.string == "!" then return not result else return result end end return true elseif rule.type.string == "Pattern" then local repetition = "" local prefix = "" if rule.errorhandling and rule.errorhandling.type.string == "Warning" then io.write("Warning (row="..parser.row..", column="..parser.column.."): "..rule.errorhandling.message.string) end if rule.prefix then prefix = rule.prefix.string end if rule.repetition then repetition = rule.repetition.string end -- First check for simple rules (string, dot and class), because we can -- use regular expressions to match them. if rule.pattern.type.string == "String" then if not rule.pattern.is_escaped then rule.pattern.value.string = string.gsub(rule.pattern.value.string, "[%$%^%(%)%%%.%[%]%*%+%-%?]", "%%%0") rule.pattern.is_escaped = true end result = parser:read_next("^"..rule.pattern.value.string..repetition) if parser.grabs ~= 0 and result then node.string = node.string..result end elseif rule.pattern.type.string == "Dot" then result = parser:read_next("^".."."..repetition) if parser.grabs ~= 0 and result then node.string = node.string..result end elseif rule.pattern.type.string == "Class" then result = parser:read_next("^".."["..rule.pattern.value.string.."]"..repetition) if parser.grabs ~= 0 and result then node.string = node.string..result end else -- Otherwise we handle the complex rules: if repetition == "*" then while epeg.run_rule(parser, rule.pattern, node, rule) do end result = true elseif repetition == "?" then epeg.run_rule(parser, rule.pattern, node, rule) result = true elseif repetition == "+" then result = epeg.run_rule(parser, rule.pattern, node, rule) while epeg.run_rule(parser, rule.pattern, node, rule) do end else result = epeg.run_rule(parser, rule.pattern, node, rule) end end if rule.prefix and rule.prefix.string == "!" then result = not result end if result and not rule.prefix then return true end if not result and rule.errorhandling and rule.errorhandling.type.string == "Error" then parser:error(rule.errorhandling.message.string) end else parser:error("Epeg construct "..tostring(rule.type.string).." not implemented or unknown.") end -- Reset parser to position before we processed the rule. -- (used by !, & and if the rule failed) -- If the rule failed, we have to reset the grabbed input, too. if parser.grabs ~= 0 and #(node.string) ~= string_old_length and not result then node.string = string_old end parser.row = row parser.column = column parser.position = position return result end -- Finishes the coroutine with an errormessage and returns false. function epeg:error(text) io.write("Error (row=", tostring(self.row), ", column=", tostring(self.column), "): ", tostring(text), ".\n") yield(false) end -------------------------------------------------------------------------------- -- -- -- Validation of Grammar -- -- -- -------------------------------------------------------------------------------- -- Checks grammar against infinite left recursion. -- returns true if no error, else false. -- Prints its status to stdout. function epeg.check(grammar) local ok = true local top = grammar[0] io.write("Checking...\n") -- check against possible infinite left recursion. Algorithm taken from -- peg/leg by Ian Piumarta. -- See: http://piumarta.com/software/peg/ for more information. for i,v in pairs(grammar) do if i ~= 0 then epeg.consumesInput(v, grammar) end end for i,v in pairs(grammar) do if i ~= 0 then if v.is_marked_lr then ok = false end end end if ok then io.write("... Success\n") end return ok end function epeg.consumesInput(node, grammar) if node == nil then return false end if node.type.string == "Rule" then local result = false if node.reached ~= nil then if node.is_marked_lr == nil then io.write("Possible endless left recursion in ", node.name.string, ".\n") node.is_marked_lr = true end else node.reached = true result = epeg.consumesInput(node.rule, grammar) node.reached = nil end return result elseif node.type.string == "Choice" then for i,v in ipairs(node) do if not epeg.consumesInput(v, grammar) then return false end end return true elseif node.type.string == "List" then for i,v in ipairs(node) do if epeg.consumesInput(v, grammar) then return true end end return false elseif node.type.string == "RuleName" then return epeg.consumesInput(grammar[node.name.string], grammar) elseif node.type.string == "AnonymousFixedNode" then return false elseif node.type.string == "AnonymousGrabbingNode" then return epeg.consumesInput(node.grabs, grammar) elseif node.type.string == "FixedNode" then return false elseif node.type.string == "GrabbingNode" then return epeg.consumesInput(node.grabs, grammar) elseif node.type.string == "CollectInput" then return epeg.consumesInput(node.grabs, grammar) elseif node.type.string == "Error" then return false elseif node.type.string == "Warning" then return false elseif node.type.string == "Resume" then return false elseif node.type.string == "FunctionCall" then return false elseif node.type.string == "EmbeddedCode" then return false elseif node.type.string == "String" then if node.value.string == "" then return false end return true elseif node.type.string == "Class" then if node.value.string == "" then return false end return true elseif node.type.string == "Dot" then return true elseif node.type.string == "Pattern" then -- The pattern does not need to consume input if it uses ? or *. if node.repetition and (node.repetition.string == "*" or node.repetition.string == "?") then return false end return epeg.consumesInput(node.pattern, grammar) else io.write("Error: Unknown epeg construct: ", tostring(node.type.string), ".\n") return false end end -------------------------------------------------------------------------------- -- -- -- Dumping -- -- -- -------------------------------------------------------------------------------- -- Dumps a table and its child tables into the specified file. -- Does not work with cyclic tables (endless recursion). function epeg.dump_table(table, file, depth) local tabs = string.rep("\t", depth) for i,v in pairs(table) do if i ~= "position" and i ~= "column" and i ~= "row" and i ~= "pindex" and i ~= "parent" then if type(i) == "string" then file:write(tabs, "[\"", i, "\"] = ") else file:write(tabs, "[", tostring(i), "] = ") end if type(v) == "table" then file:write("{\n") epeg.dump_table(v, file, depth + 1) file:write(tabs, "},\n") else if type(v) == "string" then file:write("\"", epeg.escape_string(v), "\",\n") else file:write(tostring(v), ",\n") end end end end end -------------------------------------------------------------------------------- -- -- -- Debugging -- -- -- -------------------------------------------------------------------------------- -- Prints a noncyclic table to stdout. Cyclic tables cause -- infinite rekursion (DONT USE ON GRAMMARS OR ASTS!). function epeg.print_table(tab, depth) if not (type(tab) == "table") then print ("failure"); return end if depth == nil then depth = 0 end local tabs = string.rep("\t", depth) for i,v in pairs(tab) do if type(v) ~= "table" then io.write(tabs, tostring(i), ": ", tostring(v), "\n") end end for i,v in pairs(tab) do if type(v) == "table" then io.write(tabs, tostring(i), ": (table)\n") epeg.print_table(v, depth + 1) end end end -- Prints a grammar translated back as epeg to stdout. -- warning: old function epeg.grammar2epeg(grammar) for i,v in pairs(grammar) do io.write("\n", i, " <- ") epeg.translate_node(v.rule) io.write('\n') end end -- warning: old function epeg.translate_node(node) if node.type.string == "Choice" then for i,v in ipairs(node) do epeg.translate_node(v) if node.list[i + 1] ~= nil then io.write('/ ') end end elseif node.type.string == "List" then for i,v in ipairs(node) do epeg.translate_node(v) end elseif node.type.string == "RuleName" then io.write(node.name.string, " ") elseif node.type.string == "AnonymousFixedNode" then io.write("<:: ") epeg.translate_node(node.grabs) io.write(">") elseif node.type.string == "AnonymousGrabbingNode" then io.write("<: ") epeg.translate_node(node.grabs) io.write(">") elseif node.type.string == "FixedNode" then io.write("<", node.name.string, ":: ") epeg.translate_node(node.grabs) io.write(">") elseif node.type.string == "GrabbingNode" then io.write("<", node.name.string, ": ") epeg.translate_node(node.grabs) io.write(">") elseif node.type.string == "CollectInput" then io.write("< ") epeg.translate_node(node.grabs) io.write(" >") elseif node.type.string == "Error" then io.write(" error (") epeg.translate_node(node.message) io.write(") ") if node.recover then io.write("recover (") epeg.translate_node(node.recover) io.write(") ") end elseif node.type.string == "Warning" then io.write("warning (") epeg.translate_node(node.message) io.write(") ") elseif node.type.string == "Resume" then io.write("resume ") elseif node.type.string == "FunctionCall" then io.write("{: ", node.name.string, " } ") elseif node.type.string == "EmbeddedCode" then io.write("{", node.code, "} ") elseif node.type.string == "String" then io.write("\"", node.value.string, "\" ") elseif node.type.string == "Class" then io.write("[", node.value.string, "] ") elseif node.type.string == "Dot" then io.write(".") elseif node.type.string == "Pattern" then if node.prefix then io.write(node.prefix.string) end if node.pattern.type.string == "Choice" then io.write("(") epeg.translate_node(node.pattern) io.write(")") else epeg.translate_node(node.pattern) end if node.repetition then io.write(node.repetition.string) end if node.errorhandling then epeg.translate_node(node.errorhandling) end else io.write("\n***ERROR***:", node.type.string, " \n") end end -------------------------------------------------------------------------------- -- -- -- Escaping/Unescaping -- -- -- -------------------------------------------------------------------------------- epeg.esc_table = { ["\a"] = '\\a', ["\b"] = '\\b', ["\f"] = '\\f', ["\n"] = "\\n", ["\r"] = "\\r", ["\t"] = '\\t', ["\v"] = '\\v', ["\""] = '\\\"', ["\'"] = '\\\'', ["\["] = '\\\[', ["\]"] = '\\\]', ["\\"] = '\\\\', } epeg.unesc_table = { ["\\a"] = '\a', ["\\b"] = '\b', ["\\f"] = '\f', ["\\n"] = '\n', ["\\r"] = '\r', ["\\t"] = '\t', ["\\v"] = '\v', ['\\"'] = '\"', ["\\'"] = "\'", ["\\["] = '\[', ["\\]"] = '\]', ["\\\\"] = '\\', } function epeg.unescape_string(str) local result = {} local pos = 1 local oldpos = 1 local echar, tesc result = string.gsub(str, "\\.", epeg.unesc_table) return result end function epeg.escape_string(str) local result result = string.gsub(str, "[]\\\a\b\f\n\r\t\v\"\'[]", epeg.esc_table) return result end -------------------------------------------------------------------------------- -- -- -- Grammar -- -- -- -------------------------------------------------------------------------------- epeg.grammar = { [0] = "Grammar", ["Pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Pattern", }, ["rule"] = { ["string"] = "", [1] = { [1] = { ["string"] = "", ["name"] = { ["string"] = "type", }, ["grabs"] = { ["string"] = "Pattern", }, ["type"] = { ["string"] = "FixedNode", }, }, [2] = { ["string"] = "", ["pattern"] = { [1] = { [1] = { ["string"] = "", ["pattern"] = { [1] = { ["string"] = "", [2] = { ["string"] = "", ["name"] = { ["string"] = "prefix", }, ["grabs"] = { ["string"] = "&", }, ["type"] = { ["string"] = "FixedNode", }, }, [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "and", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, [2] = { ["string"] = "", [2] = { ["string"] = "", ["name"] = { ["string"] = "prefix", }, ["grabs"] = { ["string"] = "!", }, ["type"] = { ["string"] = "FixedNode", }, }, [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "not", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, ["string"] = "", }, ["type"] = { ["string"] = "Pattern", }, }, [2] = { ["string"] = "", ["name"] = { ["string"] = "pattern", }, ["grabs"] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { [1] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "FunctionCall", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, [2] = { ["string"] = "", [2] = { ["string"] = "", ["name"] = { ["string"] = "type", }, ["grabs"] = { ["string"] = "Dot", }, ["type"] = { ["string"] = "FixedNode", }, }, [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "dot", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, [3] = { ["string"] = "", [2] = { ["string"] = "", ["name"] = { ["string"] = "type", }, ["grabs"] = { ["string"] = "RuleName", }, ["type"] = { ["string"] = "FixedNode", }, }, [1] = { ["string"] = "", ["name"] = { ["string"] = "name", }, ["grabs"] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Identifier", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "GrabbingNode", }, }, ["type"] = { ["string"] = "List", }, }, [4] = { ["string"] = "", [2] = { ["string"] = "", ["name"] = { ["string"] = "type", }, ["grabs"] = { ["string"] = "Class", }, ["type"] = { ["string"] = "FixedNode", }, }, [1] = { ["string"] = "", ["name"] = { ["string"] = "value", }, ["grabs"] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Class", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "GrabbingNode", }, }, ["type"] = { ["string"] = "List", }, }, [5] = { ["string"] = "", [2] = { ["string"] = "", ["name"] = { ["string"] = "type", }, ["grabs"] = { ["string"] = "String", }, ["type"] = { ["string"] = "FixedNode", }, }, [1] = { ["string"] = "", ["name"] = { ["string"] = "value", }, ["grabs"] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "String", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "GrabbingNode", }, }, ["type"] = { ["string"] = "List", }, }, [6] = { [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "open", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, [2] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Choice", }, ["type"] = { ["string"] = "RuleName", }, }, ["errorhandling"] = { ["message"] = { ["string"] = "\'.../...\' Expected after \')\'.", }, ["string"] = "", ["type"] = { ["string"] = "error", }, }, ["type"] = { ["string"] = "Pattern", }, }, [3] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "close", }, ["type"] = { ["string"] = "RuleName", }, }, ["errorhandling"] = { ["message"] = { ["string"] = "\'(\' expected after \'.../...\'.", }, ["string"] = "", ["type"] = { ["string"] = "error", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, ["string"] = "", }, ["string"] = "", ["type"] = { ["string"] = "Choice", }, }, ["errorhandling"] = { ["message"] = { ["string"] = " \'{ ... }\', \'.\', \'\[...\]\', \"...\" or rulename expected after &/!.", }, ["string"] = "", ["type"] = { ["string"] = "error", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "GrabbingNode", }, }, [3] = { ["repetition"] = { ["string"] = "?", }, ["string"] = "", ["pattern"] = { [1] = { ["string"] = "", [2] = { ["string"] = "", ["name"] = { ["string"] = "repetition", }, ["grabs"] = { ["string"] = "?", }, ["type"] = { ["string"] = "FixedNode", }, }, [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "query", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["string"] = "", ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, ["string"] = "", }, [2] = { ["string"] = "", [2] = { ["repetition"] = { ["string"] = "?", }, ["string"] = "", ["pattern"] = { [1] = { ["string"] = "", [2] = { ["string"] = "", ["name"] = { ["string"] = "repetition", }, ["grabs"] = { ["string"] = "?", }, ["type"] = { ["string"] = "FixedNode", }, }, [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "query", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, [2] = { ["string"] = "", [2] = { ["string"] = "", ["name"] = { ["string"] = "repetition", }, ["grabs"] = { ["string"] = "*", }, ["type"] = { ["string"] = "FixedNode", }, }, [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "star", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, [3] = { ["string"] = "", [2] = { ["string"] = "", ["name"] = { ["string"] = "repetition", }, ["grabs"] = { ["string"] = "+", }, ["type"] = { ["string"] = "FixedNode", }, }, [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "plus", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["string"] = "", }, ["type"] = { ["string"] = "Pattern", }, }, [1] = { ["string"] = "", ["name"] = { ["string"] = "pattern", }, ["grabs"] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { [1] = { ["string"] = "", [2] = { ["string"] = "", ["name"] = { ["string"] = "type", }, ["grabs"] = { ["string"] = "Dot", }, ["type"] = { ["string"] = "FixedNode", }, }, [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "dot", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, [2] = { ["string"] = "", [2] = { ["string"] = "", ["name"] = { ["string"] = "type", }, ["grabs"] = { ["string"] = "RuleName", }, ["type"] = { ["string"] = "FixedNode", }, }, [1] = { ["string"] = "", ["name"] = { ["string"] = "name", }, ["grabs"] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "IdentifierWithoutLeftArrow", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "GrabbingNode", }, }, ["type"] = { ["string"] = "List", }, }, [5] = { [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "open", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, [2] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Choice", }, ["type"] = { ["string"] = "RuleName", }, }, ["errorhandling"] = { ["message"] = { ["string"] = "\'.../...\' Expected after \')\'.", }, ["string"] = "", ["type"] = { ["string"] = "error", }, }, ["type"] = { ["string"] = "Pattern", }, }, [3] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "close", }, ["type"] = { ["string"] = "RuleName", }, }, ["errorhandling"] = { ["message"] = { ["string"] = "\'(\' expected after \'.../...\'.", }, ["string"] = "", ["type"] = { ["string"] = "error", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, ["string"] = "", }, ["type"] = { ["string"] = "Choice", }, [3] = { ["string"] = "", [2] = { ["string"] = "", ["name"] = { ["string"] = "type", }, ["grabs"] = { ["string"] = "Class", }, ["type"] = { ["string"] = "FixedNode", }, }, [1] = { ["string"] = "", ["name"] = { ["string"] = "value", }, ["grabs"] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Class", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "GrabbingNode", }, }, ["type"] = { ["string"] = "List", }, }, [4] = { ["string"] = "", [2] = { ["string"] = "", ["name"] = { ["string"] = "type", }, ["grabs"] = { ["string"] = "String", }, ["type"] = { ["string"] = "FixedNode", }, }, [1] = { ["string"] = "", ["name"] = { ["string"] = "value", }, ["grabs"] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "String", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "GrabbingNode", }, }, ["type"] = { ["string"] = "List", }, }, ["string"] = "", }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "GrabbingNode", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, ["string"] = "", }, ["type"] = { ["string"] = "Pattern", }, }, [3] = { ["repetition"] = { ["string"] = "?", }, ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "ErrorHandling", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, ["string"] = "", }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["close"] = { ["string"] = "", ["name"] = { ["string"] = "close", }, ["rule"] = { ["string"] = "", [1] = { ["string"] = "", [2] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Spacing", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "String", }, ["value"] = { ["string"] = ")", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["AnonymousFixedNode"] = { ["string"] = "", ["name"] = { ["string"] = "AnonymousFixedNode", }, ["rule"] = { ["string"] = "", [1] = { [1] = { ["string"] = "", ["name"] = { ["string"] = "type", }, ["grabs"] = { ["string"] = "AnonymousFixedNode", }, ["type"] = { ["string"] = "FixedNode", }, }, [2] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "colon2", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, [3] = { ["string"] = "", ["name"] = { ["string"] = "grabs", }, ["grabs"] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "String", }, ["type"] = { ["string"] = "RuleName", }, }, ["errorhandling"] = { ["message"] = { ["string"] = "Expected string after \'(::\'.", }, ["string"] = "", ["type"] = { ["string"] = "error", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "GrabbingNode", }, }, ["type"] = { ["string"] = "List", }, ["string"] = "", }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["leftarrow"] = { ["string"] = "", ["name"] = { ["string"] = "leftarrow", }, ["rule"] = { ["string"] = "", [1] = { ["string"] = "", [2] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Spacing", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "String", }, ["value"] = { ["string"] = "<-", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["colon"] = { ["string"] = "", ["name"] = { ["string"] = "colon", }, ["rule"] = { ["string"] = "", [1] = { ["string"] = "", [2] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Spacing", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "String", }, ["value"] = { ["string"] = ":", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["Identifier"] = { ["string"] = "", ["name"] = { ["string"] = "Identifier", }, ["rule"] = { ["string"] = "", [1] = { [1] = { ["pattern"] = { [1] = { ["string"] = "", [2] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "ForcedSeparation", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, [1] = { ["string"] = "", ["pattern"] = { [1] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "String", }, ["value"] = { ["string"] = "error", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, [2] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "String", }, ["value"] = { ["string"] = "warning", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, [3] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "String", }, ["value"] = { ["string"] = "recover", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, [4] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "String", }, ["value"] = { ["string"] = "resume", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["string"] = "", }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["string"] = "", ["type"] = { ["string"] = "Choice", }, }, ["string"] = "", ["prefix"] = { ["string"] = "!", }, ["type"] = { ["string"] = "Pattern", }, }, [2] = { ["string"] = "", ["grabs"] = { ["string"] = "", [2] = { ["repetition"] = { ["string"] = "*", }, ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "Class", }, ["value"] = { ["string"] = "a-zA-Z_0-9", }, }, ["type"] = { ["string"] = "Pattern", }, }, [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "Class", }, ["value"] = { ["string"] = "a-zA-Z_", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "CollectInput", }, }, [3] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Spacing", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, ["string"] = "", }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["slash"] = { ["string"] = "", ["name"] = { ["string"] = "slash", }, ["rule"] = { ["string"] = "", [1] = { ["string"] = "", [2] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Spacing", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "String", }, ["value"] = { ["string"] = "/", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["begin"] = { ["string"] = "", ["name"] = { ["string"] = "begin", }, ["rule"] = { ["string"] = "", [1] = { ["string"] = "", [2] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Spacing", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "String", }, ["value"] = { ["string"] = "<", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["Error"] = { ["string"] = "", ["name"] = { ["string"] = "Error", }, ["rule"] = { ["string"] = "", [1] = { ["string"] = "", [2] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "close", }, ["type"] = { ["string"] = "RuleName", }, }, ["errorhandling"] = { ["message"] = { ["string"] = "\')\' expected after errormessage", }, ["string"] = "", ["type"] = { ["string"] = "error", }, }, ["type"] = { ["string"] = "Pattern", }, }, [1] = { ["string"] = "", ["name"] = { ["string"] = "errorhandling", }, ["grabs"] = { [1] = { ["string"] = "", ["name"] = { ["string"] = "type", }, ["grabs"] = { ["string"] = "error", }, ["type"] = { ["string"] = "FixedNode", }, }, [2] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "String", }, ["value"] = { ["string"] = "error", }, }, ["type"] = { ["string"] = "Pattern", }, }, [3] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "ForcedSeparation", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, [4] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "open", }, ["type"] = { ["string"] = "RuleName", }, }, ["errorhandling"] = { ["message"] = { ["string"] = "\'(\' expected after \'error\'.", }, ["string"] = "", ["type"] = { ["string"] = "error", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, [5] = { ["string"] = "", ["name"] = { ["string"] = "message", }, ["grabs"] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "String", }, ["type"] = { ["string"] = "RuleName", }, }, ["errorhandling"] = { ["message"] = { ["string"] = "Expected \'errormessage\'.", }, ["string"] = "", ["type"] = { ["string"] = "error", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "GrabbingNode", }, }, ["string"] = "", }, ["type"] = { ["string"] = "GrabbingNode", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["AnonymousGrabbingNode"] = { ["string"] = "", ["name"] = { ["string"] = "AnonymousGrabbingNode", }, ["rule"] = { ["string"] = "", [1] = { [1] = { ["string"] = "", ["name"] = { ["string"] = "type", }, ["grabs"] = { ["string"] = "AnonymousGrabbingNode", }, ["type"] = { ["string"] = "FixedNode", }, }, [2] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "colon", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, [3] = { ["string"] = "", ["name"] = { ["string"] = "grabs", }, ["grabs"] = { ["string"] = "", [1] = { ["repetition"] = { ["string"] = "?", }, ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "List", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "GrabbingNode", }, }, ["type"] = { ["string"] = "List", }, ["string"] = "", }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["String"] = { ["string"] = "", ["name"] = { ["string"] = "String", }, ["rule"] = { ["string"] = "", [2] = { [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "String", }, ["value"] = { ["string"] = "\"", }, }, ["type"] = { ["string"] = "Pattern", }, }, [2] = { ["string"] = "", ["grabs"] = { ["string"] = "", [1] = { ["repetition"] = { ["string"] = "*", }, ["string"] = "", ["pattern"] = { [1] = { ["string"] = "", [2] = { ["string"] = "", ["pattern"] = { [1] = { ["string"] = "", [1] = { ["repetition"] = { ["string"] = "?", }, ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "String", }, ["value"] = { ["string"] = "\\\"", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, [2] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "Dot", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, ["string"] = "", }, ["type"] = { ["string"] = "Pattern", }, }, [1] = { ["pattern"] = { ["string"] = "", ["value"] = { ["string"] = "\"", }, ["type"] = { ["string"] = "String", }, }, ["string"] = "", ["prefix"] = { ["string"] = "!", }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["string"] = "", ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "CollectInput", }, }, [3] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "String", }, ["value"] = { ["string"] = "\"", }, }, ["type"] = { ["string"] = "Pattern", }, }, [4] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Spacing", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, ["string"] = "", }, [1] = { [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "String", }, ["value"] = { ["string"] = "\'", }, }, ["type"] = { ["string"] = "Pattern", }, }, [2] = { ["string"] = "", ["grabs"] = { ["string"] = "", [1] = { ["repetition"] = { ["string"] = "*", }, ["string"] = "", ["pattern"] = { [1] = { ["string"] = "", [2] = { ["string"] = "", ["pattern"] = { [1] = { ["string"] = "", [1] = { ["repetition"] = { ["string"] = "?", }, ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "String", }, ["value"] = { ["string"] = "\\\'", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, [2] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "Dot", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, ["string"] = "", }, ["type"] = { ["string"] = "Pattern", }, }, [1] = { ["pattern"] = { ["string"] = "", ["value"] = { ["string"] = "\'", }, ["type"] = { ["string"] = "String", }, }, ["string"] = "", ["prefix"] = { ["string"] = "!", }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["string"] = "", ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "CollectInput", }, }, [3] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "String", }, ["value"] = { ["string"] = "\'", }, }, ["type"] = { ["string"] = "Pattern", }, }, [4] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Spacing", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, ["string"] = "", }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["Comment"] = { ["string"] = "", ["name"] = { ["string"] = "Comment", }, ["rule"] = { ["string"] = "", [1] = { ["string"] = "", [2] = { ["repetition"] = { ["string"] = "*", }, ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "Class", }, ["value"] = { ["string"] = "^\r\n", }, }, ["type"] = { ["string"] = "Pattern", }, }, [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "String", }, ["value"] = { ["string"] = "#", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["Class"] = { ["string"] = "", ["name"] = { ["string"] = "Class", }, ["rule"] = { ["string"] = "", [1] = { [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "String", }, ["value"] = { ["string"] = "\[", }, }, ["type"] = { ["string"] = "Pattern", }, }, [2] = { ["string"] = "", ["grabs"] = { [1] = { ["repetition"] = { ["string"] = "?", }, ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "String", }, ["value"] = { ["string"] = "^", }, }, ["type"] = { ["string"] = "Pattern", }, }, [2] = { ["repetition"] = { ["string"] = "?", }, ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "String", }, ["value"] = { ["string"] = "\]", }, }, ["type"] = { ["string"] = "Pattern", }, }, [3] = { ["repetition"] = { ["string"] = "*", }, ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "Class", }, ["value"] = { ["string"] = "^\]", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, ["string"] = "", }, ["type"] = { ["string"] = "CollectInput", }, }, [3] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "String", }, ["value"] = { ["string"] = "\]", }, }, ["type"] = { ["string"] = "Pattern", }, }, [4] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Spacing", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, ["string"] = "", }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["FixedNode"] = { ["string"] = "", ["name"] = { ["string"] = "FixedNode", }, ["rule"] = { ["string"] = "", [1] = { [1] = { ["string"] = "", ["name"] = { ["string"] = "type", }, ["grabs"] = { ["string"] = "FixedNode", }, ["type"] = { ["string"] = "FixedNode", }, }, [2] = { ["grabs"] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Identifier", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["string"] = "", ["name"] = { ["string"] = "name", }, ["type"] = { ["string"] = "GrabbingNode", }, }, [3] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "colon2", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, [4] = { ["string"] = "", ["name"] = { ["string"] = "grabs", }, ["grabs"] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "String", }, ["type"] = { ["string"] = "RuleName", }, }, ["errorhandling"] = { ["message"] = { ["string"] = "Expected string after \'(Node::\'.", }, ["string"] = "", ["type"] = { ["string"] = "error", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "GrabbingNode", }, }, ["type"] = { ["string"] = "List", }, ["string"] = "", }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["ForcedSeparation"] = { ["string"] = "", ["name"] = { ["string"] = "ForcedSeparation", }, ["rule"] = { ["string"] = "", [1] = { ["string"] = "", [2] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Spacing", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, [1] = { ["pattern"] = { ["string"] = "", ["value"] = { ["string"] = "^%w", }, ["type"] = { ["string"] = "Class", }, }, ["string"] = "", ["prefix"] = { ["string"] = "&", }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["ErrorHandling"] = { ["string"] = "", ["name"] = { ["string"] = "ErrorHandling", }, ["rule"] = { ["string"] = "", [2] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Error", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, [1] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Warning", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["query"] = { ["string"] = "", ["name"] = { ["string"] = "query", }, ["rule"] = { ["string"] = "", [1] = { ["string"] = "", [2] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Spacing", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "String", }, ["value"] = { ["string"] = "?", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["EndOfFile"] = { ["string"] = "", ["name"] = { ["string"] = "EndOfFile", }, ["rule"] = { ["string"] = "", [1] = { ["string"] = "", [1] = { ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "Dot", }, }, ["string"] = "", ["prefix"] = { ["string"] = "!", }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["star"] = { ["string"] = "", ["name"] = { ["string"] = "star", }, ["rule"] = { ["string"] = "", [1] = { ["string"] = "", [2] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Spacing", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "String", }, ["value"] = { ["string"] = "*", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["Rule"] = { ["string"] = "", ["name"] = { ["string"] = "Rule", }, ["rule"] = { ["string"] = "", [1] = { ["string"] = "", [2] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Spacing", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, [1] = { ["string"] = "", ["grabs"] = { [1] = { ["string"] = "", ["name"] = { ["string"] = "type", }, ["grabs"] = { ["string"] = "Rule", }, ["type"] = { ["string"] = "FixedNode", }, }, [2] = { ["string"] = "", ["name"] = { ["string"] = "name", }, ["grabs"] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Identifier", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "GrabbingNode", }, }, [3] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "leftarrow", }, ["type"] = { ["string"] = "RuleName", }, }, ["errorhandling"] = { ["message"] = { ["string"] = "\'<-\' expected after name of rule.", }, ["string"] = "", ["type"] = { ["string"] = "error", }, }, ["type"] = { ["string"] = "Pattern", }, }, [4] = { ["string"] = "", ["name"] = { ["string"] = "rule", }, ["grabs"] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Choice", }, ["type"] = { ["string"] = "RuleName", }, }, ["errorhandling"] = { ["message"] = { ["string"] = "\'Pattern / ... / ...\' expected after \'<-\'.", }, ["string"] = "", ["type"] = { ["string"] = "error", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "GrabbingNode", }, }, ["type"] = { ["string"] = "List", }, ["string"] = "", }, ["type"] = { ["string"] = "AnonymousGrabbingNode", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["Spacing"] = { ["string"] = "", ["name"] = { ["string"] = "Spacing", }, ["rule"] = { ["string"] = "", [1] = { ["string"] = "", [1] = { ["repetition"] = { ["string"] = "*", }, ["string"] = "", ["pattern"] = { [1] = { ["string"] = "", [1] = { ["repetition"] = { ["string"] = "+", }, ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "Class", }, ["value"] = { ["string"] = "%s", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, [2] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Comment", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, ["string"] = "", }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["dot"] = { ["string"] = "", ["name"] = { ["string"] = "dot", }, ["rule"] = { ["string"] = "", [1] = { ["string"] = "", [2] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Spacing", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "String", }, ["value"] = { ["string"] = ".", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["not"] = { ["string"] = "", ["name"] = { ["string"] = "not", }, ["rule"] = { ["string"] = "", [1] = { ["string"] = "", [2] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Spacing", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "String", }, ["value"] = { ["string"] = "!", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["colon2"] = { ["string"] = "", ["name"] = { ["string"] = "colon2", }, ["rule"] = { ["string"] = "", [1] = { ["string"] = "", [2] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Spacing", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "String", }, ["value"] = { ["string"] = "::", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["end"] = { ["string"] = "", ["name"] = { ["string"] = "end", }, ["rule"] = { ["string"] = "", [1] = { ["string"] = "", [2] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Spacing", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "String", }, ["value"] = { ["string"] = ">", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["FunctionCall"] = { ["string"] = "", ["name"] = { ["string"] = "FunctionCall", }, ["rule"] = { ["string"] = "", [1] = { [1] = { ["string"] = "", ["name"] = { ["string"] = "type", }, ["grabs"] = { ["string"] = "FunctionCall", }, ["type"] = { ["string"] = "FixedNode", }, }, [2] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "String", }, ["value"] = { ["string"] = "{:", }, }, ["type"] = { ["string"] = "Pattern", }, }, [3] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Spacing", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, [4] = { ["string"] = "", ["name"] = { ["string"] = "function", }, ["grabs"] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { [1] = { ["string"] = "", [1] = { ["string"] = "", ["grabs"] = { ["string"] = "", [2] = { ["repetition"] = { ["string"] = "*", }, ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "Class", }, ["value"] = { ["string"] = "a-zA-Z_.:0-9", }, }, ["type"] = { ["string"] = "Pattern", }, }, [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "Class", }, ["value"] = { ["string"] = "a-zA-Z_", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "CollectInput", }, }, ["type"] = { ["string"] = "List", }, }, ["string"] = "", ["type"] = { ["string"] = "Choice", }, }, ["errorhandling"] = { ["message"] = { ["string"] = "Name of function expected after \'{:\'.", }, ["string"] = "", ["type"] = { ["string"] = "error", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "GrabbingNode", }, }, [5] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Spacing", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, [6] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "String", }, ["value"] = { ["string"] = "}", }, }, ["errorhandling"] = { ["message"] = { ["string"] = "Expected \'}\' after name of function.", }, ["string"] = "", ["type"] = { ["string"] = "error", }, }, ["type"] = { ["string"] = "Pattern", }, }, [7] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Spacing", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["string"] = "", ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["List"] = { ["string"] = "", ["name"] = { ["string"] = "List", }, ["rule"] = { ["string"] = "", [1] = { ["string"] = "", [2] = { ["repetition"] = { ["string"] = "+", }, ["string"] = "", ["pattern"] = { [1] = { ["string"] = "", [1] = { ["string"] = "", ["grabs"] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { [1] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Collecting", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, [2] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Pattern", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, [3] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "FunctionCall", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["string"] = "", }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "AnonymousGrabbingNode", }, }, ["type"] = { ["string"] = "List", }, }, ["string"] = "", ["type"] = { ["string"] = "Choice", }, }, ["errorhandling"] = { ["message"] = { ["string"] = "Expected Pattern, \'resume\', < ... > or { ... }.", }, ["string"] = "", ["type"] = { ["string"] = "error", }, }, ["type"] = { ["string"] = "Pattern", }, }, [1] = { ["string"] = "", ["name"] = { ["string"] = "type", }, ["grabs"] = { ["string"] = "List", }, ["type"] = { ["string"] = "FixedNode", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["open"] = { ["string"] = "", ["name"] = { ["string"] = "open", }, ["rule"] = { ["string"] = "", [1] = { ["string"] = "", [2] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Spacing", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "String", }, ["value"] = { ["string"] = "(", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["CollectInput"] = { ["string"] = "", ["name"] = { ["string"] = "CollectInput", }, ["rule"] = { ["string"] = "", [1] = { ["string"] = "", [2] = { ["string"] = "", ["name"] = { ["string"] = "grabs", }, ["grabs"] = { ["string"] = "", [1] = { ["repetition"] = { ["string"] = "?", }, ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "List", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "GrabbingNode", }, }, [1] = { ["string"] = "", ["name"] = { ["string"] = "type", }, ["grabs"] = { ["string"] = "CollectInput", }, ["type"] = { ["string"] = "FixedNode", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["Choice"] = { ["string"] = "", ["name"] = { ["string"] = "Choice", }, ["rule"] = { ["string"] = "", [1] = { [1] = { ["string"] = "", ["name"] = { ["string"] = "type", }, ["grabs"] = { ["string"] = "Choice", }, ["type"] = { ["string"] = "FixedNode", }, }, [2] = { ["string"] = "", ["grabs"] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "List", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "AnonymousGrabbingNode", }, }, [3] = { ["repetition"] = { ["string"] = "*", }, ["string"] = "", ["pattern"] = { [1] = { ["string"] = "", [2] = { ["string"] = "", ["grabs"] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "List", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "AnonymousGrabbingNode", }, }, [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "slash", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["string"] = "", ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, ["string"] = "", }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["Grammar"] = { ["string"] = "", ["name"] = { ["string"] = "Grammar", }, ["rule"] = { ["string"] = "", [1] = { [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Spacing", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, [2] = { ["repetition"] = { ["string"] = "+", }, ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Rule", }, ["type"] = { ["string"] = "RuleName", }, }, ["errorhandling"] = { ["message"] = { ["string"] = "Expected at least one rule in file.", }, ["string"] = "", ["type"] = { ["string"] = "error", }, }, ["type"] = { ["string"] = "Pattern", }, }, [3] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "EndOfFile", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, ["string"] = "", }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["plus"] = { ["string"] = "", ["name"] = { ["string"] = "plus", }, ["rule"] = { ["string"] = "", [1] = { ["string"] = "", [2] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Spacing", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "String", }, ["value"] = { ["string"] = "+", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["Collecting"] = { ["string"] = "", ["name"] = { ["string"] = "Collecting", }, ["rule"] = { ["string"] = "", [1] = { [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "begin", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, [2] = { ["string"] = "", ["pattern"] = { [1] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "AnonymousFixedNode", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, [2] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "AnonymousGrabbingNode", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, [5] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "CollectInput", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, [3] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "FixedNode", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, [4] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "GrabbingNode", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["string"] = "", }, ["type"] = { ["string"] = "Pattern", }, }, [3] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "end", }, ["type"] = { ["string"] = "RuleName", }, }, ["errorhandling"] = { ["message"] = { ["string"] = "Expected \'>\' after \'<...\'.", }, ["string"] = "", ["type"] = { ["string"] = "error", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, ["string"] = "", }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["Warning"] = { ["string"] = "", ["name"] = { ["string"] = "Warning", }, ["rule"] = { ["string"] = "", [1] = { ["string"] = "", [2] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "close", }, ["type"] = { ["string"] = "RuleName", }, }, ["errorhandling"] = { ["message"] = { ["string"] = "\')\' expected after warningmessage", }, ["string"] = "", ["type"] = { ["string"] = "error", }, }, ["type"] = { ["string"] = "Pattern", }, }, [1] = { ["string"] = "", ["name"] = { ["string"] = "errorhandling", }, ["grabs"] = { [1] = { ["string"] = "", ["name"] = { ["string"] = "type", }, ["grabs"] = { ["string"] = "warning", }, ["type"] = { ["string"] = "FixedNode", }, }, [2] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "String", }, ["value"] = { ["string"] = "warning", }, }, ["type"] = { ["string"] = "Pattern", }, }, [3] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "ForcedSeparation", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, [4] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "open", }, ["type"] = { ["string"] = "RuleName", }, }, ["errorhandling"] = { ["message"] = { ["string"] = "\'(\' expected after \'warning\'.", }, ["string"] = "", ["type"] = { ["string"] = "error", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, [5] = { ["string"] = "", ["name"] = { ["string"] = "message", }, ["grabs"] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "String", }, ["type"] = { ["string"] = "RuleName", }, }, ["errorhandling"] = { ["message"] = { ["string"] = "Expected \"warningmessage\".", }, ["string"] = "", ["type"] = { ["string"] = "error", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "GrabbingNode", }, }, ["string"] = "", }, ["type"] = { ["string"] = "GrabbingNode", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["GrabbingNode"] = { ["string"] = "", ["name"] = { ["string"] = "GrabbingNode", }, ["rule"] = { ["string"] = "", [1] = { [1] = { ["string"] = "", ["name"] = { ["string"] = "type", }, ["grabs"] = { ["string"] = "GrabbingNode", }, ["type"] = { ["string"] = "FixedNode", }, }, [2] = { ["string"] = "", ["name"] = { ["string"] = "name", }, ["grabs"] = { ["string"] = "", [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Identifier", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "GrabbingNode", }, }, [3] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "colon", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, [4] = { ["string"] = "", ["name"] = { ["string"] = "grabs", }, ["grabs"] = { ["string"] = "", [1] = { ["repetition"] = { ["string"] = "?", }, ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "List", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "GrabbingNode", }, }, ["type"] = { ["string"] = "List", }, ["string"] = "", }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["and"] = { ["string"] = "", ["name"] = { ["string"] = "and", }, ["rule"] = { ["string"] = "", [1] = { ["string"] = "", [2] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Spacing", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["type"] = { ["string"] = "String", }, ["value"] = { ["string"] = "&", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, ["IdentifierWithoutLeftArrow"] = { ["string"] = "", ["name"] = { ["string"] = "IdentifierWithoutLeftArrow", }, ["rule"] = { ["string"] = "", [1] = { ["string"] = "", [2] = { ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "leftarrow", }, ["type"] = { ["string"] = "RuleName", }, }, ["string"] = "", ["prefix"] = { ["string"] = "!", }, ["type"] = { ["string"] = "Pattern", }, }, [1] = { ["string"] = "", ["pattern"] = { ["string"] = "", ["name"] = { ["string"] = "Identifier", }, ["type"] = { ["string"] = "RuleName", }, }, ["type"] = { ["string"] = "Pattern", }, }, ["type"] = { ["string"] = "List", }, }, ["type"] = { ["string"] = "Choice", }, }, ["type"] = { ["string"] = "Rule", }, }, } return epeg