1
0

whileのパースを実装.

This commit is contained in:
otya128
2015-07-12 12:17:01 +09:00
parent d006d1266c
commit 4d58b0ff56
3 changed files with 45 additions and 2 deletions

View File

@@ -60,6 +60,8 @@ class Lexical
reserved["DIM"] = TokenType.Var; reserved["DIM"] = TokenType.Var;
reserved["DEF"] = TokenType.Def; reserved["DEF"] = TokenType.Def;
reserved["OUT"] = TokenType.Out; reserved["OUT"] = TokenType.Out;
reserved["WHILE"] = TokenType.While;
reserved["WEND"] = TokenType.WEnd;
reserved.rehash(); reserved.rehash();
line = 1; line = 1;
} }
@@ -606,6 +608,22 @@ class Parser
lex.popFront(); lex.popFront();
return statements; return statements;
} }
Statements whileStatements()
{
auto statements = new Statements();
while(!lex.empty())
{
auto type = lex.front().type;
if(type == TokenType.WEnd) break;
auto statement = statement();
if(statement != Statement.NOP)
{
statements.addStatement(statement);
}
}
lex.popFront();
return statements;
}
void syntaxError() void syntaxError()
{ {
stderr.writeln("Syntax error (", lex.getLine(), ')', " Mysterious ", lex.front().type); stderr.writeln("Syntax error (", lex.getLine(), ')', " Mysterious ", lex.front().type);
@@ -735,6 +753,9 @@ class Parser
lex.popFront(); lex.popFront();
node = var(); node = var();
return node; return node;
case TokenType.While:
node = whileStatement();
break;
default: default:
syntaxError(); syntaxError();
break; break;
@@ -900,6 +921,19 @@ class Parser
node = new For(init, to, step, statements); node = new For(init, to, step, statements);
return node; return node;
} }
While whileStatement()
{
lex.popFront();
auto expr = expression();
if(expr is null)
{
syntaxError();
return null;
}
Statements statements = whileStatements();
auto node = new While(expr, statements);
return node;
}
If if_() If if_()
{ {
lex.popFront(); lex.popFront();

View File

@@ -367,13 +367,22 @@ WHILE 1
CL=(CL+1) MOD 16 : VSYNC 2 CL=(CL+1) MOD 16 : VSYNC 2
WEND`*/ WEND`*/
`CLS : CL=0 `CLS : CL=0
WHILE 1
FOR I=0 TO 15
LOCATE 9,4+I : COLOR (CL+I) MOD 16
PRINT "Ё プチコン3ゴウ Ж"
NEXT
CL=(CL+1) MOD 16 : VSYNC 1
WEND`
/*
`CLS : CL=0
@LOOP @LOOP
FOR I=0 TO 15 FOR I=0 TO 15
LOCATE 9,4+I : COLOR (CL+I) MOD 16 LOCATE 9,4+I : COLOR (CL+I) MOD 16
PRINT "Ё プチコン3ゴウ Ж" PRINT "Ё プチコン3ゴウ Ж"
NEXT NEXT
CL=(CL+1) MOD 16 : VSYNC 1 CL=(CL+1) MOD 16 : VSYNC 1
GOTO @LOOP` GOTO @LOOP`*/
); );
auto vm = parser.compile(); auto vm = parser.compile();
bool running = true; bool running = true;

View File

@@ -55,7 +55,7 @@ enum TokenType
Def, Def,
Out, Out,
While, While,
Wend, WEnd,
} }
struct Token struct Token