예제 #1
0
파일: Parser.cs 프로젝트: tjhlansbergen/E
        private void _processToken(EToken token, ETree tree)
        {
            switch (token.Type)
            {
            case ETokenType.WHITESPACE:
            case ETokenType.COMMENT:
            case ETokenType.OPEN:
                // do nothing
                break;

            case ETokenType.CLOSE:
                _handleClose();
                break;

            case ETokenType.CONSTANT:
                _handleConstant(token, tree);
                break;

            case ETokenType.OBJECT:
                _handleObject(token, tree);
                break;

            case ETokenType.PROPERTY:
                _handleProperty(token);
                break;

            case ETokenType.UTILITY:
                _handleUtility(token, tree);
                break;

            case ETokenType.FUNCTION:
                _handleFunction(token);
                break;

            case ETokenType.FUNCTION_STATEMENT:
                _handleStatement(token);
                break;

            case ETokenType.DECLARATION:
                _handleDeclaration(token);
                break;

            case ETokenType.FUNCTION_CALL:
                _handleFunctionCall(token);
                break;

            case ETokenType.FUNCTION_RETURN:
                _handleFunctionReturn(token);
                break;

            case ETokenType.ASSIGNMENT:
                _handleAssignment(token);
                break;

            default:
                throw new ParserException($"Unhandled token type {token.Type} at line: {token.LineNumber}");
            }
        }
예제 #2
0
파일: Parser.cs 프로젝트: tjhlansbergen/E
        private void _handleConstant(EToken token, ETree tree)
        {
            EConstant constant;

            try { constant = Parsers.ParseConstant(token.Line); }
            catch { throw new ParserException(_unparsebleMessage("constant", token.LineNumber)); }

            tree.Constants.Add(constant);
        }
예제 #3
0
파일: Parser.cs 프로젝트: tjhlansbergen/E
        private void _handleUtility(EToken token, ETree tree)
        {
            EUtility utility;

            try { utility = Parsers.ParseUtility(_getNamespac(), token.Line); }
            catch { throw new ParserException(_unparsebleMessage("utility", token.LineNumber)); }

            tree.Utilities.Add(utility);
            _callStack.Push(utility);
        }
예제 #4
0
파일: Parser.cs 프로젝트: tjhlansbergen/E
        private void _handleObject(EToken token, ETree tree)
        {
            EObject objct;

            try { objct = Parsers.ParseObject(_getNamespac(), token.Line); }
            catch { throw new ParserException(_unparsebleMessage("object", token.LineNumber)); }

            tree.Objects.Add(objct);
            _callStack.Push(objct);
        }
예제 #5
0
파일: Parser.cs 프로젝트: tjhlansbergen/E
        private void _handleProperty(EToken token)
        {
            if (_callStack.Any() && _callStack.Peek() is EObject obj)
            {
                EProperty prop;

                try { prop = Parsers.ParseProperty(token.Line); }
                catch { throw new ParserException(_unparsebleMessage("property", token.LineNumber)); }

                obj.Properties.Add(prop);
            }
            else
            {
                throw new ParserException(_unexpectedMessage("property", token.LineNumber));
            }
        }
예제 #6
0
파일: Parser.cs 프로젝트: tjhlansbergen/E
        private void _handleFunction(EToken token)
        {
            if (_callStack.Any() && _callStack.Peek() is EUtility util)
            {
                EFunction function;

                try { function = Parsers.ParseFunction(_getNamespac(), token.Line); }
                catch { throw new ParserException(_unparsebleMessage("function", token.LineNumber)); }

                util.Functions.Add(function);
                _callStack.Push(function);
            }
            else
            {
                throw new ParserException(_unexpectedMessage("function", token.LineNumber));
            }
        }
예제 #7
0
파일: Parser.cs 프로젝트: tjhlansbergen/E
        private void _handleFunctionReturn(EToken token)
        {
            if (_callStack.Any() && (_callStack.Peek() is EFunction || _callStack.Peek() is EStatement))
            {
                EReturn retn;

                try { retn = Parsers.ParseReturnStatement(token.Line); }
                catch { throw new ParserException(_unparsebleMessage("return statement", token.LineNumber)); }

                if (_callStack.Peek() is EFunction func)
                {
                    func.Elements.Add(retn);
                }
                else if (_callStack.Peek() is EStatement stat)
                {
                    stat.Elements.Add(retn);
                }
            }
            else
            {
                throw new ParserException(_unexpectedMessage("return statement", token.LineNumber));
            }
        }
예제 #8
0
파일: Parser.cs 프로젝트: tjhlansbergen/E
        private void _handleFunctionCall(EToken token)
        {
            if (_callStack.Any() && (_callStack.Peek() is EFunction || _callStack.Peek() is EStatement))
            {
                EFunctionCall call;

                try { call = Parsers.ParseFunctionCall(token.Line); }
                catch { throw new ParserException(_unparsebleMessage("function call", token.LineNumber)); }

                if (_callStack.Peek() is EFunction func)
                {
                    func.Elements.Add(call);
                }
                else if (_callStack.Peek() is EStatement stat)
                {
                    stat.Elements.Add(call);
                }
            }
            else
            {
                throw new ParserException(_unexpectedMessage("function call", token.LineNumber));
            }
        }
예제 #9
0
파일: Parser.cs 프로젝트: tjhlansbergen/E
        private void _handleAssignment(EToken token)
        {
            if (_callStack.Any() && (_callStack.Peek() is EFunction || _callStack.Peek() is EStatement))
            {
                EAssignment assign;

                try { assign = Parsers.ParseAssignment(token.Line); }
                catch { throw new ParserException(_unparsebleMessage("assignment", token.LineNumber)); }

                if (_callStack.Peek() is EFunction func)
                {
                    func.Elements.Add(assign);
                }
                else if (_callStack.Peek() is EStatement stat)
                {
                    stat.Elements.Add(assign);
                }
            }
            else
            {
                throw new ParserException(_unexpectedMessage("assignment", token.LineNumber));
            }
        }
예제 #10
0
파일: Parser.cs 프로젝트: tjhlansbergen/E
        private void _handleDeclaration(EToken token)
        {
            if (_callStack.Any() && (_callStack.Peek() is EFunction || _callStack.Peek() is EStatement))
            {
                EDeclaration init;

                try { init = Parsers.ParseDeclaration(token.Line); }
                catch { throw new ParserException(_unparsebleMessage("object declaration", token.LineNumber)); }

                if (_callStack.Peek() is EFunction func)
                {
                    func.Elements.Add(init);
                }
                else if (_callStack.Peek() is EStatement stat)
                {
                    stat.Elements.Add(init);
                }
            }
            else
            {
                throw new ParserException(_unexpectedMessage("object declaration", token.LineNumber));
            }
        }