summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOskari Timperi <oskari.timperi@iki.fi>2015-12-10 18:57:45 +0200
committerOskari Timperi <oskari.timperi@iki.fi>2015-12-10 18:57:45 +0200
commite713dee6a3e4a751723b5d4ef54716b53355b93b (patch)
tree219db5cf183001f33832d1c58d8ab375df460480
parent34758ebd78d39075dc58f88d33a28c700612121c (diff)
downloadlbasi-e713dee6a3e4a751723b5d4ef54716b53355b93b.tar.gz
lbasi-e713dee6a3e4a751723b5d4ef54716b53355b93b.zip
break Interpreter to Interpreter and Lexer
-rw-r--r--calc1.pas60
1 files changed, 40 insertions, 20 deletions
diff --git a/calc1.pas b/calc1.pas
index 541ae15..8e1b1ab 100644
--- a/calc1.pas
+++ b/calc1.pas
@@ -32,10 +32,9 @@ type
constructor Create;
end;
- Interpreter = class
+ Lexer = class
Text: AnsiString;
CurPos: Integer;
- Current: Token;
constructor Create(Text_: AnsiString);
@@ -45,6 +44,15 @@ type
function CurChar: Char;
function GetInteger: Integer;
function GetNextToken: Token;
+ end;
+
+ Interpreter = class
+ Lexer: Lexer;
+ CurrentToken: Token;
+
+ constructor Create(Lexer_: Lexer);
+
+ procedure Error;
procedure Eat(T: TokenType);
function Expr: Integer;
end;
@@ -87,36 +95,35 @@ begin
inherited Create(TT_Eof);
end;
-constructor Interpreter.Create(Text_: String);
+constructor Lexer.Create(Text_: String);
begin
inherited Create;
Text := Text_;
CurPos := 1;
- Current := Default(Token);
end;
-procedure Interpreter.Error;
+procedure Lexer.Error;
begin
- Raise Exception.Create('error!');
+ Raise Exception.Create('invalid input');
end;
-procedure Interpreter.SkipWhitespace;
+procedure Lexer.SkipWhitespace;
begin
while (not AtEnd) and IsWhiteSpace(CurChar) do
Inc(CurPos);
end;
-function Interpreter.AtEnd: Boolean;
+function Lexer.AtEnd: Boolean;
begin
Result := CurPos > Length(Text);
end;
-function Interpreter.CurChar: Char;
+function Lexer.CurChar: Char;
begin
Result := Text[CurPos];
end;
-function Interpreter.GetInteger: Integer;
+function Lexer.GetInteger: Integer;
var
Start: Integer;
begin
@@ -128,7 +135,7 @@ begin
Result := StrToInt(Copy(Text, Start, CurPos - Start));
end;
-function Interpreter.GetNextToken: Token;
+function Lexer.GetNextToken: Token;
begin
SkipWhitespace;
@@ -166,11 +173,22 @@ begin
Error;
end;
+constructor Interpreter.Create(Lexer_: Lexer);
+begin
+ Lexer := Lexer_;
+ CurrentToken := Default(Token);
+end;
+
+procedure Interpreter.Error;
+begin
+ Raise Exception.Create('syntax error');
+end;
+
procedure Interpreter.Eat(T: TokenType);
begin
- if Current.TokenType = T then
+ if CurrentToken.TokenType = T then
begin
- Current := GetNextToken;
+ CurrentToken := Lexer.GetNextToken;
end
else
Error;
@@ -180,18 +198,18 @@ function Interpreter.Expr: Integer;
var
Left, Op, Right: Token;
begin
- Current := GetNextToken;
+ CurrentToken := Lexer.GetNextToken;
- Left := Current;
+ Left := CurrentToken;
Eat(TT_Integer);
- Op := Current;
+ Op := CurrentToken;
while (Op.TokenType = TT_Plus) or (Op.TokenType = TT_Minus) do
begin
Eat(Op.TokenType);
- Right := Current;
+ Right := CurrentToken;
Eat(TT_Integer);
if Op.TokenType = TT_Plus then
@@ -201,7 +219,7 @@ begin
TokenInteger(Left).Val := Result;
- Op := Current;
+ Op := CurrentToken;
if Op.TokenType = TT_Eof then
Exit;
@@ -212,7 +230,7 @@ begin
else
Eat(TT_Slash);
- Right := Current;
+ Right := CurrentToken;
Eat(TT_Integer);
if Op.TokenType = TT_Plus then
@@ -226,13 +244,15 @@ begin
end;
var
+ Lexer_: Lexer;
Interp: Interpreter;
Line: String;
I: Integer;
procedure InterpString(S: String);
begin
- Interp := Interpreter.Create(S);
+ Lexer_ := Lexer.Create(S);
+ Interp := Interpreter.Create(Lexer_);
WriteLn(Interp.Expr);
FreeAndNil(Interp);
end;