add: Array declaration and variable indexer.

This commit is contained in:
2024-08-17 17:50:28 +08:00
parent c7077bd0fd
commit 97f9fb9ec3
12 changed files with 200 additions and 30 deletions

View File

@@ -139,8 +139,15 @@ public sealed class GrammarParser : GrammarParserBuilder
public static IParser<LexicalToken, VariableNode> VariableParser()
{
return from token in Satisfy<LexicalToken>(token => token.TokenType == LexicalTokenType.Identifier)
select new VariableNode(token.LiteralValue);
return Choice(
from token in IdentifierParser()
from _ in Delimiter("[")
from expressions in ExpressionsParser()
from _1 in Delimiter("]")
select new VariableNode(token, expressions),
from token in IdentifierParser()
select new VariableNode(token)
);
}
public static IParser<LexicalToken, SyntaxNodeBase> StatementParser()
@@ -193,10 +200,28 @@ public sealed class GrammarParser : GrammarParserBuilder
select new BlockNode(tokens)).Try(new BlockNode([]));
}
public static IParser<LexicalToken, TypeNode> ArrayTypeParser()
{
IParser<LexicalToken, IEnumerable<ArrayRange>> arrayRangeParser = (
from left in IntegerParser()
from _ in Delimiter("..")
from right in IntegerParser()
select new ArrayRange(left.Value, right.Value)).SeparatedBy1(Delimiter(","));
return from _ in Keyword("array")
from _1 in Delimiter("[")
from ranges in arrayRangeParser
from _2 in Delimiter("]")
from _3 in Keyword("of")
from typeToken in BasicTypeParser()
select new TypeNode(typeToken, ranges);
}
public static IParser<LexicalToken, SyntaxNodeBase> TypeParser()
{
return from token in BasicTypeParser()
select new TypeNode(token);
return Choice(ArrayTypeParser(),
from token in BasicTypeParser()
select new TypeNode(token));
}
public static IParser<LexicalToken, VariableDeclarationNode> VariableDeclarationParser()

View File

@@ -31,6 +31,12 @@ public abstract class GrammarParserBuilder
select new BooleanValueNode(false);
}
protected static IParser<LexicalToken, IntegerValueNode> IntegerParser()
{
return from token in Satisfy<LexicalToken>(token => token.TokenType == LexicalTokenType.ConstInteger)
select new IntegerValueNode(int.Parse(token.LiteralValue));
}
protected static IParser<LexicalToken, SyntaxNodeBase> NumberParser()
{
return Choice<LexicalToken, SyntaxNodeBase>(
@@ -56,4 +62,9 @@ public abstract class GrammarParserBuilder
Keyword("char")
);
}
protected static IParser<LexicalToken, LexicalToken> IdentifierParser()
{
return Satisfy<LexicalToken>(token => token.TokenType == LexicalTokenType.Identifier);
}
}