public static ScriptObject ParseNode(ParseState state, String start = "(", String end = ")") { var result = new GenericScriptObject("@type", "node", "@start", state.start, "@source", state); if (!state.MatchNext(start)) { throw new ParseError("Expected " + start, state.currentLine); } state.Advance(start.Length); while (!state.AtEnd() && !state.MatchNext(end)) { DevourWhitespace(state); if (state.Next() == '}') //Super-brace { return(result); } if (!state.AtEnd() && !state.MatchNext(end)) { var expression = ParseExpression(state); if (isType(expression, "memberaccess")) { expression = ReorderMemberAccessNode(expression); } children(result).Add(expression); } DevourWhitespace(state); } if (end != null) { state.Advance(end.Length); } return(result); }
public static ScriptObject ParseNumber(ParseState state) { var result = new GenericScriptObject("@type", "number", "@start", state.start, "@source", state); bool foundDot = false; var numbertype = 0; if (state.MatchNext("0x")) { state.Advance(2); numbertype = 1; } else if (state.MatchNext("0b")) { state.Advance(2); numbertype = 2; } else if (state.Next() == '-') { state.Advance(); } while (!state.AtEnd()) { if (numbertype == 0 && state.Next() >= '0' && state.Next() <= '9') { state.Advance(); continue; } else if (numbertype == 1 && IsHex(state.Next())) { state.Advance(); continue; } else if (numbertype == 2 && (state.Next() == '0' || state.Next() == '1')) { state.Advance(); continue; } else if (numbertype == 0 && state.Next() == '.') { if (foundDot) { break; } foundDot = true; state.Advance(); continue; } break; } result["@end"] = state.start; result["@token"] = state.source.Substring(asInt(result["@start"]), asInt(result["@end"]) - asInt(result["@start"])); return(result); }
public static int ParseComment(ParseState state) { var start = state.start; state.Advance(2); while (!state.AtEnd() && !state.MatchNext("*/")) state.Advance(); state.Advance(2); return state.start - start; }
public static int ParseComment(ParseState state) { var start = state.start; state.Advance(2); while (!state.AtEnd() && !state.MatchNext("*/")) { state.Advance(); } state.Advance(2); return(state.start - start); }
public static ScriptObject ParseRoot(String script, String filename) { var commentFree = new StringBuilder(); var state = new ParseState { start = 0, end = script.Length, source = script, filename = filename }; while (!state.AtEnd()) { if (state.MatchNext("\\/*")) { commentFree.Append("\\/*"); state.Advance(3); } else if (state.MatchNext("/*")) { commentFree.Append(new String(' ', ParseComment(state))); } else { commentFree.Append(state.Next()); state.Advance(); } } var r = ParseNode( new ParseState { start = 0, end = commentFree.Length, source = commentFree.ToString(), filename = filename }, "", null); if (r._children.Count == 1) { return(r._child(0) as ScriptObject); } r.SetProperty("@type", "root"); return(r); }
public static ParseNode ParseRoot(String script, String filename) { var commentFree = ""; var state = new ParseState { start = 0, end = script.Length, source = script, filename = filename }; while (!state.AtEnd()) { if (state.MatchNext("/*")) commentFree += (new String(' ',ParseComment(state))); else { commentFree += state.Next(); state.Advance(); } } return ParseStringExpression(new ParseState { start = 0, end = commentFree.Length, source = commentFree, filename = filename }, true); }
public static ParseNode ParseNode(ParseState state, String start = "(", String end = ")") { var result = new ParseNode(NodeType.Node, state.start, state); if (!state.MatchNext(start)) throw new ParseError("Expected " + start, state.currentLine); state.Advance(start.Length); while (!state.MatchNext(end)) { DevourWhitespace(state); if (!state.MatchNext(end)) { var expression = ParseExpression(state); if (expression.type == NodeType.MemberAccess) expression = ReorderMemberAccessNode(expression); result.childNodes.Add(expression); } DevourWhitespace(state); } state.Advance(end.Length); return result; }
public static ScriptObject ParseRoot(String script, String filename) { var commentFree = new StringBuilder(); var state = new ParseState { start = 0, end = script.Length, source = script, filename = filename }; while (!state.AtEnd()) { if (state.MatchNext("/*")) commentFree.Append(new String(' ',ParseComment(state))); else { commentFree.Append(state.Next()); state.Advance(); } } var r = ParseNode( new ParseState { start = 0, end = commentFree.Length, source = commentFree.ToString(), filename = filename }, "", null); if (r._children.Count == 1) return r._child(0) as ScriptObject; r.SetProperty("@type", "root"); return r; }
public static ScriptObject ParseNode(ParseState state, String start = "(", String end = ")") { var result = new GenericScriptObject("@type", "node", "@start", state.start, "@source", state); if (!state.MatchNext(start)) throw new ParseError("Expected " + start, state.currentLine); state.Advance(start.Length); while (!state.AtEnd() && !state.MatchNext(end)) { DevourWhitespace(state); if (state.Next() == '}') return result; if (!state.AtEnd() && !state.MatchNext(end)) { var expression = ParseExpression(state); if (isType(expression, "memberaccess")) expression = ReorderMemberAccessNode(expression); children(result).Add(expression); } DevourWhitespace(state); } if (end != null) state.Advance(end.Length); return result; }