[add] Implemented a part of parsing rules.
This commit is contained in:
parent
6886416a30
commit
3d51830ec7
105
sjscript/src/sjscript/parse.d
Normal file
105
sjscript/src/sjscript/parse.d
Normal file
@ -0,0 +1,105 @@
|
||||
/// License: MIT
|
||||
module sjscript.parse;
|
||||
|
||||
import dast.parse;
|
||||
|
||||
import sjscript.Expression,
|
||||
sjscript.ParametersBlock,
|
||||
sjscript.Token;
|
||||
|
||||
///
|
||||
unittest {
|
||||
import std;
|
||||
import dast.tokenize : Tokenize;
|
||||
|
||||
enum src = q"EOS
|
||||
framebuffer 0 {
|
||||
a = 0;
|
||||
b += 0;
|
||||
}
|
||||
EOS";
|
||||
try {
|
||||
src.
|
||||
Tokenize!TokenType.
|
||||
filter!(x => x.type != TokenType.Whitespace).
|
||||
chain([Token("", TokenType.End)]).
|
||||
Parse().
|
||||
each!writeln;
|
||||
} catch (ParseException!Token e) {
|
||||
"%s at %s".writefln(e.msg, e.token);
|
||||
}
|
||||
}
|
||||
|
||||
///
|
||||
ParametersBlock[] Parse(R)(R tokens) {
|
||||
return dast.parse.Parse!Whole(tokens, cast(RuleSet) null).blocks;
|
||||
}
|
||||
|
||||
private class RuleSet {
|
||||
public:
|
||||
@ParseRule:
|
||||
static Whole ParseWhole(ParametersBlock[] blocks, @(TokenType.End) Token) {
|
||||
return Whole(blocks);
|
||||
}
|
||||
|
||||
static ParametersBlock[] ParseParametersBlockListFirstItem(ParametersBlock block) {
|
||||
return [block];
|
||||
}
|
||||
static ParametersBlock[] ParseParametersBlockListFollowingItem(
|
||||
ParametersBlock[] blocks, ParametersBlock block) {
|
||||
return blocks ~ block;
|
||||
}
|
||||
|
||||
static ParametersBlock ParseParametersBlock(
|
||||
@(TokenType.Ident) Token target,
|
||||
Period period,
|
||||
@(TokenType.OpenBrace) Token,
|
||||
Parameter[] params,
|
||||
@(TokenType.CloseBrace) Token closebrace) {
|
||||
return ParametersBlock(
|
||||
target.text, period, params, CreateTokenPos(target, closebrace));
|
||||
}
|
||||
|
||||
static Period ParsePeriod(@(TokenType.Number) Token) { // TODO
|
||||
return Period(0, 0);
|
||||
}
|
||||
|
||||
static Parameter[] ParseParameterListFirstItem(Parameter param) {
|
||||
return [param];
|
||||
}
|
||||
static Parameter[] ParseParameterListFollowingItem(
|
||||
Parameter[] params, Parameter param) {
|
||||
return params ~ param;
|
||||
}
|
||||
|
||||
static Parameter ParseAssignParameter(
|
||||
@(TokenType.Ident) Token ident,
|
||||
@(TokenType.Assign) Token,
|
||||
Expression expr,
|
||||
@(TokenType.SemiColon) Token semicolon) {
|
||||
return Parameter(
|
||||
ident.text, ParameterType.Assign, expr, CreateTokenPos(ident, semicolon));
|
||||
}
|
||||
static Parameter ParseAddAssignParameter(
|
||||
@(TokenType.Ident) Token ident,
|
||||
@(TokenType.AddAssign) Token,
|
||||
Expression expr,
|
||||
@(TokenType.SemiColon) Token semicolon) {
|
||||
return Parameter(
|
||||
ident.text, ParameterType.AddAssign, expr, CreateTokenPos(ident, semicolon));
|
||||
}
|
||||
|
||||
static Expression ParseExpression(@(TokenType.Number) Token) { // TODO
|
||||
return Expression();
|
||||
}
|
||||
}
|
||||
|
||||
private struct Whole {
|
||||
ParametersBlock[] blocks;
|
||||
}
|
||||
|
||||
private TokenPos CreateTokenPos(Token first, Token last) {
|
||||
return TokenPos(
|
||||
first.pos.stline, last.pos.edline,
|
||||
first.pos.stchar, last.pos.edchar);
|
||||
}
|
Reference in New Issue
Block a user