diff options
| author | Oskari Timperi <oskari.timperi@iki.fi> | 2015-12-10 20:00:13 +0200 |
|---|---|---|
| committer | Oskari Timperi <oskari.timperi@iki.fi> | 2015-12-10 20:00:13 +0200 |
| commit | 1c9e17045c75d14fbd52e6b0120acb9fea457be8 (patch) | |
| tree | 8d2db493511cbd4e146dfb35e19fb3b86b444470 | |
| parent | c62e2d897f2e400d9608ff9abb285ceab4bdfc48 (diff) | |
| download | lbasi-master.tar.gz lbasi-master.zip | |
| -rw-r--r-- | calc1.pas | 33 |
1 files changed, 30 insertions, 3 deletions
@@ -6,7 +6,8 @@ uses typinfo, sysutils, character; type - TokenType = (TT_Integer, TT_Plus, TT_Minus, TT_Asterisk, TT_Slash, TT_Eof); + TokenType = (TT_Integer, TT_Plus, TT_Minus, TT_Asterisk, TT_Slash, TT_Eof, + TT_LParen, TT_RParen); Token = class TokenType: TokenType; @@ -171,6 +172,16 @@ begin Result := Token.Create(TT_Slash); Inc(CurPos); end + else if CurChar = '(' then + begin + Result := Token.Create(TT_LParen); + Inc(CurPos); + end + else if CurChar = ')' then + begin + Result := Token.Create(TT_RParen); + Inc(CurPos); + end else Error; end; @@ -202,14 +213,30 @@ var T: Token; begin T := CurrentToken; - Eat(TT_Integer); - Result := TokenInteger(T).Val; + + if T.TokenType = TT_Integer then + begin + Eat(TT_Integer); + Result := TokenInteger(T).Val; + end + else if T.TokenType = TT_LParen then + begin + Eat(TT_LParen); + Result := Expr; + Eat(TT_RParen); + end + else + Error; end; function TInterpreter.Expr: Integer; var Tok: Token; begin + // expr : term ((PLUS|MINUS) term)* + // term : factor ((MUL|DIV) factor)* + // factor : INTEGER | LPAREN expr RPAREN + Result := Term; while CurrentToken.TokenType in [TT_Plus, TT_Minus] do |
