예제 #1
0
    public static EchelonScriptErrorMessage GenUnexpectedIdentifier(EchelonScriptToken token)
    {
        var tokenText    = StringPool.Shared.GetOrAdd(token.Text.Span);
        var errorMessage = UnexpectedX.Replace("{0}", "identifier").Replace("{1}", tokenText);

        return(new EchelonScriptErrorMessage(token, errorMessage));
    }
예제 #2
0
    public static EchelonScriptErrorMessage GenExpectedXGotY(string expected, EchelonScriptToken token)
    {
        var tokenText    = StringPool.Shared.GetOrAdd(token.Text.Span);
        var errorMessage = ExpectedXGotY.Replace("{0}", expected).Replace("{1}", tokenText);

        return(new EchelonScriptErrorMessage(token, errorMessage));
    }
예제 #3
0
    private void codeText_TextChanged(object sender, EventArgs e)
    {
        using var d = Dispatcher.DisableProcessing();

        var code = codeText.Text;

        errors.Clear();
        tokenizer.SetSource("Buffer".AsMemory(), code.AsMemory());

        textMarkerService.Clear();
        errorsList.Items.Clear();
        tokensTree.Items.Clear();

        var tok = new EchelonScriptToken()
        {
            Type = EchelonScriptTokenType.Invalid
        };
        EchelonScriptToken?docComment;

        while (tok.Type != EchelonScriptTokenType.EOF)
        {
            (tok, docComment) = tokenizer.NextToken();

            var tokItem = new TreeViewItem {
                Header = $"{tok.Type} ({tok.TextLine}:{tok.TextColumn})"
            };
            if (tok.Text.Length > 0)
            {
                tokItem.ToolTip = $"Text: \"{tok.Text}\"";
            }
            tokItem.Tag = tok;

            if (docComment != null)
            {
                var docItem = new TreeViewItem {
                    Header  = $"{docComment?.Type} ({docComment?.TextLine}:{docComment?.TextColumn})",
                    ToolTip = $"Text: \"{docComment?.Text}\"",
                    Tag     = docComment.Value
                };
                tokItem.Items.Add(docItem);
            }

            tokensTree.Items.Add(tokItem);
        }
        foreach (var error in errors)
        {
            errorsList.Items.Add($"Line {error.Line}, column {error.Column}: {error.Message}");

            if (error.Length == 0 || (error.StartPos + error.Length >= codeText.Text.Length))
            {
                continue;
            }

            DisplayError(error.Column, error.Line, error.Message);
        }
    }
예제 #4
0
    public EchelonScriptErrorMessage(EchelonScriptToken tk, string?message = null)
    {
        Message = message;

        StartPos = tk.TextStartPos;
        Length   = tk.Text.Length;

        FileName = tk.FileName.Span.GetPooledString();
        Line     = tk.TextLine;
        Column   = tk.TextColumn;
    }
예제 #5
0
    public ES_AstNamespace(
        ES_AstDottableIdentifier name, ES_AstNode? [] contents,
        EchelonScriptToken namespaceTk, EchelonScriptToken closeBraceTk
        ) : base(1)
    {
        NamespaceName = name;
        Contents      = contents;

        bounds = new ES_AstNodeBounds {
            StartPos = namespaceTk.TextStartPos,
            EndPos   = closeBraceTk.TextEndPos,
        };
    }
예제 #6
0
    public static EchelonScriptErrorMessage GenInstAccessOnStatic(string memberName, EchelonScriptToken errorToken)
    {
        var errorMessage = InstAccessOnStatic.Replace("{memberName}", memberName);

        return(new EchelonScriptErrorMessage(errorToken, errorMessage));
    }
예제 #7
0
 public static EchelonScriptErrorMessage GenTypeAlreadyConst(bool newImmut, bool oldImmut, EchelonScriptToken tk)
 => new (tk, GenTypeAlreadyConst(newImmut, oldImmut));
예제 #8
0
    public static EchelonScriptErrorMessage GenTypeNotNullable(string typeName, EchelonScriptToken errorToken)
    {
        var errorMessage = TypeNotNullable.Replace("{typeName}", typeName);

        return(new EchelonScriptErrorMessage(errorToken, errorMessage));
    }
예제 #9
0
    public static EchelonScriptErrorMessage GenStaticAccessOnInst(string typeName, string memberName, EchelonScriptToken errorToken)
    {
        var errorMessage = StaticAccessOnInst.Replace("{typeName}", typeName).Replace("{memberName}", memberName);

        return(new EchelonScriptErrorMessage(errorToken, errorMessage));
    }
예제 #10
0
    public static EchelonScriptErrorMessage GenInvalidExprTerm(string exprTerm, EchelonScriptToken errorToken)
    {
        var errorMessage = InvalidExprTerm.Replace("{exprTerm}", exprTerm);

        return(new EchelonScriptErrorMessage(errorToken, errorMessage));
    }
예제 #11
0
    public static EchelonScriptErrorMessage GenIntLitTooBig(bool sign, ES_IntSize size, EchelonScriptToken errorToken)
    {
        var signStr = sign ? "a signed" : "an unsigned";

        var sizeStr = size switch {
            ES_IntSize.Int8 => "8",
            ES_IntSize.Int16 => "16",
            ES_IntSize.Int32 => "32",
            ES_IntSize.Int64 => "64",

            _ => throw new NotImplementedException("Int size not implemented."),
        };

        var errorMessage = IntLitTooBigForSize.Replace("{sign}", signStr).Replace("{size}", sizeStr);

        return(new EchelonScriptErrorMessage(errorToken, errorMessage));
    }
예제 #12
0
    public static EchelonScriptErrorMessage GenDuplicateSymbolDef(string symbolName, EchelonScriptToken errorToken)
    {
        var errorMessage = DuplicateSymbolDefinition.Replace("{symbolName}", symbolName);

        return(new EchelonScriptErrorMessage(errorToken, errorMessage));
    }
예제 #13
0
 public static EchelonScriptErrorMessage GenExpectedAggregateContent(EchelonScriptToken token)
 => GenExpectedXGotY($"{ES_Keywords.Class}, {ES_Keywords.Struct} or {ES_Keywords.Enum}", token);
예제 #14
0
    public static EchelonScriptErrorMessage GenCantFindSymbol(string symbolName, EchelonScriptToken errorToken)
    {
        var errorMessage = CantFindSymbol.Replace("{symbolName}", symbolName);

        return(new EchelonScriptErrorMessage(errorToken, errorMessage));
    }
예제 #15
0
 public abstract bool ParseToken(EchelonScriptTokenizer tokenizer, ReadOnlySpan <char> peekedChars, ref EchelonScriptToken retToken);
예제 #16
0
    public static EchelonScriptErrorMessage GenInaccessibleProtectionLevel(string symbolName, EchelonScriptToken errorToken)
    {
        var errorMessage = InaccessibleProtectionLevel.Replace("{symbolName}", symbolName);

        return(new EchelonScriptErrorMessage(errorToken, errorMessage));
    }
예제 #17
0
    public static EchelonScriptErrorMessage GenTypeAlreadyDefined(string nmName, string typeName, EchelonScriptToken errorToken)
    {
        var errorMessage = TypeAlreadyDefined.Replace("{namespace}", nmName).Replace("{typeName}", typeName);

        return(new EchelonScriptErrorMessage(errorToken, errorMessage));
    }
예제 #18
0
    public static EchelonScriptErrorMessage GenInvalidModifierForContext(string modName, EchelonScriptToken token)
    {
        var errorMessage = InvalidModifierForContext.Replace("{0}", modName);

        return(new EchelonScriptErrorMessage(token, errorMessage));
    }
예제 #19
0
        public override bool ParseToken(EchelonScriptTokenizer tokenizer, ReadOnlySpan <char> peekedChars, ref EchelonScriptToken retToken)
        {
            var startPos = tokenizer.curPos;

            tokenizer.ReadChars(2);

            if (tokenizer.PeekChar() == NumberSeparator)
            {
                tokenizer.Errors.Add(new EchelonScriptErrorMessage(retToken, ES_FrontendErrors.InvalidHexLiteral));
            }
            else
            {
                tokenizer.ReadStringWhile(c => IsHexDigit(c) || c == NumberSeparator);
            }

            tokenizer.TryReadIntSuffix();

            retToken.Type = EchelonScriptTokenType.HexIntegerLiteral;
            retToken.Text = tokenizer.data [startPos..tokenizer.curPos];
예제 #20
0
    public static EchelonScriptErrorMessage GenArgTypeCantUseDefExpr(string argName, string argType, EchelonScriptToken errorToken)
    {
        var errorMessage = ArgAlreadyDefined.Replace("{arg}", argName).Replace("{argType}", argType);

        return(new EchelonScriptErrorMessage(errorToken, errorMessage));
    }
예제 #21
0
    public static EchelonScriptErrorMessage GenFuncUsedAsType(string symbolName, EchelonScriptToken errorToken)
    {
        var errorMessage = FuncUsedAsType.Replace("{symbolName}", symbolName);

        return(new EchelonScriptErrorMessage(errorToken, errorMessage));
    }
예제 #22
0
 public static EchelonScriptErrorMessage GenExpectedIdentifier(EchelonScriptToken token)
 => GenExpectedXGotY("an identifier", token);