コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
ファイル: Parser.cs プロジェクト: Blecki/BMud
 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;
 }
コード例 #4
0
        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);
        }
コード例 #5
0
        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);
        }
コード例 #6
0
ファイル: Parser.cs プロジェクト: Blecki/BMud
        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);
        }
コード例 #7
0
ファイル: Parser.cs プロジェクト: Blecki/BMud
 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;
 }
コード例 #8
0
ファイル: Parser.cs プロジェクト: hvp/Gemgine
        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;
        }
コード例 #9
0
ファイル: Parser.cs プロジェクト: hvp/Gemgine
 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;
 }