1
0

INPUTを実装.

This commit is contained in:
otya128
2015-08-19 11:28:53 +09:00
parent f682bec0f9
commit c75b129567
8 changed files with 324 additions and 5 deletions

View File

@@ -68,6 +68,7 @@ class Lexical
reserved["READ"] = TokenType.Read;
reserved["RESTORE"] = TokenType.Restore;
reserved["ON"] = TokenType.On;
reserved["INPUT"] = TokenType.Input;
reserved.rehash();
line = 1;
}
@@ -789,6 +790,8 @@ class Parser
case TokenType.On:
node = onStatement();
break;
case TokenType.Input:
return inputStatement();
default:
syntaxError();
break;
@@ -796,6 +799,60 @@ class Parser
lex.popFront();
return node;
}
//左辺値か
bool isLValue(Expression expr)
{
if(expr.type == NodeType.Variable)
{
return true;
}
if(expr.type == NodeType.BinaryOperator)
{
auto op = cast(BinaryOperator)expr;
if(!isLValue(op.item1)) return false;
return op.operator == TokenType.LBracket;
}
return false;
}
Input inputStatement()
{
lex.popFront();
Expression message = expression();
if(!message)
{
syntaxError();
return null;
}
auto token = lex.front();
if(token.type == TokenType.Semicolon || token.type == TokenType.Comma)
{
Input input = new Input(message, token.type == TokenType.Semicolon);
do
{
lex.popFront();
auto expr = expression();
if(!isLValue(expr))
{
syntaxError();
}
input.addVariable(expr);
lex.popFront();
token = lex.front();
} while(token.type == TokenType.Comma);
return input;
}
else
{
if(!isLValue(message))
{
syntaxError();
return null;
}
Input input = new Input(null, true);
input.addVariable(message);
return input;
}
}
On onStatement()
{
lex.popFront();