INC,DECのパース
This commit is contained in:
@@ -35,6 +35,7 @@ enum NodeType
|
|||||||
ArrayAssign,
|
ArrayAssign,
|
||||||
DefineFunction,
|
DefineFunction,
|
||||||
While,
|
While,
|
||||||
|
Inc,
|
||||||
}
|
}
|
||||||
abstract class Node
|
abstract class Node
|
||||||
{
|
{
|
||||||
@@ -420,3 +421,13 @@ class While : Statement
|
|||||||
this.statements = statements;
|
this.statements = statements;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
class Inc : Statement
|
||||||
|
{
|
||||||
|
wstring name;
|
||||||
|
Expression expression;
|
||||||
|
this(wstring name, Expression expr)
|
||||||
|
{
|
||||||
|
this.name = name;
|
||||||
|
this.expression = expr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -62,6 +62,8 @@ class Lexical
|
|||||||
reserved["OUT"] = TokenType.Out;
|
reserved["OUT"] = TokenType.Out;
|
||||||
reserved["WHILE"] = TokenType.While;
|
reserved["WHILE"] = TokenType.While;
|
||||||
reserved["WEND"] = TokenType.WEnd;
|
reserved["WEND"] = TokenType.WEnd;
|
||||||
|
reserved["INC"] = TokenType.Inc;
|
||||||
|
reserved["DEC"] = TokenType.Dec;
|
||||||
reserved.rehash();
|
reserved.rehash();
|
||||||
line = 1;
|
line = 1;
|
||||||
}
|
}
|
||||||
@@ -756,6 +758,9 @@ class Parser
|
|||||||
case TokenType.While:
|
case TokenType.While:
|
||||||
node = whileStatement();
|
node = whileStatement();
|
||||||
break;
|
break;
|
||||||
|
case TokenType.Inc:
|
||||||
|
case TokenType.Dec:
|
||||||
|
return incStatement();
|
||||||
default:
|
default:
|
||||||
syntaxError();
|
syntaxError();
|
||||||
break;
|
break;
|
||||||
@@ -763,6 +768,42 @@ class Parser
|
|||||||
lex.popFront();
|
lex.popFront();
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
Inc incStatement()
|
||||||
|
{
|
||||||
|
auto token = lex.front();
|
||||||
|
bool dec = token.type == TokenType.Dec;
|
||||||
|
lex.popFront();
|
||||||
|
token = lex.front();
|
||||||
|
if(token.type != TokenType.Iden)
|
||||||
|
{
|
||||||
|
syntaxError();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
wstring var = token.value.stringValue;
|
||||||
|
//TODO:Array
|
||||||
|
lex.popFront();
|
||||||
|
token = lex.front();
|
||||||
|
Expression expr;
|
||||||
|
if(token.type == TokenType.Comma)
|
||||||
|
{
|
||||||
|
lex.popFront();
|
||||||
|
expr = expression();
|
||||||
|
if(!expr)
|
||||||
|
{
|
||||||
|
syntaxError();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
expr = new Constant(Value(1));
|
||||||
|
}
|
||||||
|
if(dec)
|
||||||
|
{
|
||||||
|
expr = new BinaryOperator(new Constant(Value(0)), TokenType.Minus, expr);
|
||||||
|
}
|
||||||
|
return new Inc(var, expr);
|
||||||
|
}
|
||||||
IndexExpressions indexExpressions()
|
IndexExpressions indexExpressions()
|
||||||
{
|
{
|
||||||
IndexExpressions ie = new IndexExpressions();
|
IndexExpressions ie = new IndexExpressions();
|
||||||
|
|||||||
@@ -356,7 +356,7 @@ NEXT
|
|||||||
DEF FACT(N)
|
DEF FACT(N)
|
||||||
IF N<=1 THEN RETURN 1
|
IF N<=1 THEN RETURN 1
|
||||||
RETURN N*FACT(N-1)
|
RETURN N*FACT(N-1)
|
||||||
END"*//*
|
END"*/
|
||||||
`CLS : CL=0 : Z=0
|
`CLS : CL=0 : Z=0
|
||||||
WHILE 1
|
WHILE 1
|
||||||
INC Z : IF Z>200 THEN Z=0
|
INC Z : IF Z>200 THEN Z=0
|
||||||
@@ -365,7 +365,7 @@ WHILE 1
|
|||||||
PRINT "★ 梅雨で雨が多い季節ですね ★"
|
PRINT "★ 梅雨で雨が多い季節ですね ★"
|
||||||
NEXT
|
NEXT
|
||||||
CL=(CL+1) MOD 16 : VSYNC 2
|
CL=(CL+1) MOD 16 : VSYNC 2
|
||||||
WEND`*/
|
WEND`/*
|
||||||
`CLS : CL=0
|
`CLS : CL=0
|
||||||
WHILE 1
|
WHILE 1
|
||||||
FOR I=0 TO 15
|
FOR I=0 TO 15
|
||||||
@@ -373,7 +373,7 @@ FOR I=0 TO 15
|
|||||||
PRINT "Ё プチコン3ゴウ Ж"
|
PRINT "Ё プチコン3ゴウ Ж"
|
||||||
NEXT
|
NEXT
|
||||||
CL=(CL+1) MOD 16 : VSYNC 1
|
CL=(CL+1) MOD 16 : VSYNC 1
|
||||||
WEND`
|
WEND`*/
|
||||||
/*
|
/*
|
||||||
`CLS : CL=0
|
`CLS : CL=0
|
||||||
@LOOP
|
@LOOP
|
||||||
|
|||||||
@@ -56,6 +56,8 @@ enum TokenType
|
|||||||
Out,
|
Out,
|
||||||
While,
|
While,
|
||||||
WEnd,
|
WEnd,
|
||||||
|
Inc,
|
||||||
|
Dec,
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Token
|
struct Token
|
||||||
|
|||||||
Reference in New Issue
Block a user