summaryrefslogtreecommitdiff
path: root/crenshaw/main.pas
diff options
context:
space:
mode:
Diffstat (limited to 'crenshaw/main.pas')
-rw-r--r--crenshaw/main.pas38
1 files changed, 28 insertions, 10 deletions
diff --git a/crenshaw/main.pas b/crenshaw/main.pas
index 2ccc9de..fc1224b 100644
--- a/crenshaw/main.pas
+++ b/crenshaw/main.pas
@@ -44,23 +44,40 @@ begin
IsDigit := c in ['0'..'9'];
end;
+function IsAlNum(c: char): boolean;
+begin
+ IsAlNum := IsAlpha(c) or IsDigit(c);
+end;
+
function IsAddop(c: char): boolean;
begin
IsAddop := c in ['+', '-'];
end;
-function GetName : char;
+function GetName : string;
+var
+ Token : string;
begin
+ Token := '';
if not IsAlpha(Look) then Expected('Name');
- GetName := UpCase(Look);
- GetChar;
+ while IsAlNum(Look) do begin
+ Token := Token + UpCase(Look);
+ GetChar;
+ end;
+ GetName := Token;
end;
-function GetNum : char;
+function GetNum : string;
+var
+ Value : string;
begin
+ Value := '';
if not IsDigit(Look) then Expected('Integer');
- GetNum := Look;
- GetChar;
+ while IsDigit(Look) do begin
+ Value := Value + Look;
+ GetChar;
+ end;
+ GetNum := Value;
end;
procedure Emit(s : string);
@@ -87,11 +104,11 @@ type
var
nof_symbols : integer;
symbols : array[0..26] of record
- name : char;
+ name : string;
sym_type : symbolType;
end;
-procedure RememberName(name : char; sym_type : symbolType);
+procedure RememberName(name : string; sym_type : symbolType);
var
i : integer;
found : boolean;
@@ -110,7 +127,7 @@ begin
end;
procedure Ident;
-var name : char;
+var name : string;
begin
name := GetName;
if Look = '(' then begin
@@ -202,7 +219,8 @@ begin
end;
procedure Assignment;
-var name : char;
+var
+ name : string;
begin
name := GetName;
RememberName(name, variableType);