diff options
Diffstat (limited to 'crenshaw/main.pas')
-rw-r--r-- | crenshaw/main.pas | 38 |
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); |