add: Array declaration and variable indexer.
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user