括弧の実�
This commit is contained in:
@@ -3,9 +3,10 @@ import otya.smilebasic.parser;
|
|||||||
int main(string[] argv)
|
int main(string[] argv)
|
||||||
{
|
{
|
||||||
writeln("Hello D-World!");
|
writeln("Hello D-World!");
|
||||||
auto parser = new Parser("1+2*3+4");
|
auto parser = new Parser("1+2*(3+4)");
|
||||||
writeln(parser.calc());
|
writeln(parser.calc());
|
||||||
writeln(1+2*3+4);
|
writeln(1+2*3+4);
|
||||||
|
writeln(1+2*(3+4));
|
||||||
readln();
|
readln();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ class Lexical
|
|||||||
table['-'] = TokenType.Minus;
|
table['-'] = TokenType.Minus;
|
||||||
table['*'] = TokenType.Mul;
|
table['*'] = TokenType.Mul;
|
||||||
table['/'] = TokenType.Div;
|
table['/'] = TokenType.Div;
|
||||||
|
table['('] = TokenType.LParen;
|
||||||
|
table[')'] = TokenType.RParen;
|
||||||
}
|
}
|
||||||
bool empty()
|
bool empty()
|
||||||
{
|
{
|
||||||
@@ -140,6 +142,7 @@ class Parser
|
|||||||
}
|
}
|
||||||
int calc()
|
int calc()
|
||||||
{
|
{
|
||||||
|
lex.popFront();
|
||||||
auto exp = expression();
|
auto exp = expression();
|
||||||
writeln();
|
writeln();
|
||||||
return calc(exp);
|
return calc(exp);
|
||||||
@@ -177,7 +180,6 @@ class Parser
|
|||||||
Expression expression()
|
Expression expression()
|
||||||
{
|
{
|
||||||
Expression node = null;
|
Expression node = null;
|
||||||
lex.popFront();
|
|
||||||
return term(8, node);
|
return term(8, node);
|
||||||
}
|
}
|
||||||
Expression term(int order, Expression node)
|
Expression term(int order, Expression node)
|
||||||
@@ -221,10 +223,19 @@ class Parser
|
|||||||
stdout.flush();
|
stdout.flush();
|
||||||
node = new Constant(Value(token.value.integerValue));
|
node = new Constant(Value(token.value.integerValue));
|
||||||
break;
|
break;
|
||||||
|
case TokenType.LParen:
|
||||||
|
lex.popFront();
|
||||||
|
node = expression();
|
||||||
|
token = lex.front();
|
||||||
|
if(token.type != TokenType.RParen)
|
||||||
|
//error
|
||||||
|
{}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
if(!lex.empty())lex.popFront();
|
if(!lex.empty())
|
||||||
|
lex.popFront();
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,8 @@ enum TokenType
|
|||||||
Xor,
|
Xor,
|
||||||
Print,
|
Print,
|
||||||
If,
|
If,
|
||||||
|
LParen,
|
||||||
|
RParen,
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Token
|
struct Token
|
||||||
|
|||||||
Reference in New Issue
Block a user