diff options
author | Andreas Baumann <mail@andreasbaumann.cc> | 2018-08-18 14:52:01 +0200 |
---|---|---|
committer | Andreas Baumann <mail@andreasbaumann.cc> | 2018-08-18 14:52:01 +0200 |
commit | 5820deb5559dac39b7da8b18e4ef2e5838f41b66 (patch) | |
tree | 1e262f50850567b4f3393dcc91a52d62899ef1ea /crenshaw | |
parent | a3b01d933dc061fd9c24dd2caf121fe92c497d76 (diff) | |
download | compilertests-5820deb5559dac39b7da8b18e4ef2e5838f41b66.tar.gz compilertests-5820deb5559dac39b7da8b18e4ef2e5838f41b66.tar.bz2 |
crenshaw: expansion to multi-digit/letter symbols
Diffstat (limited to 'crenshaw')
-rw-r--r-- | crenshaw/README | 3 | ||||
-rw-r--r-- | crenshaw/main.pas | 38 | ||||
-rw-r--r-- | crenshaw/test.prog | 2 |
3 files changed, 32 insertions, 11 deletions
diff --git a/crenshaw/README b/crenshaw/README index 74f0a20..a64a6f5 100644 --- a/crenshaw/README +++ b/crenshaw/README @@ -130,3 +130,6 @@ introduces lexing stuff afterwards. Checking for LF feels hacky. +Mentions now the lexer. The mean reason for a lexer is to keep the +parser simple, for instance it can work on one lookahead 'character' +like GREATER_EQUALS instead of individually '>=' and '=>'. 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); diff --git a/crenshaw/test.prog b/crenshaw/test.prog index 3636437..e19b072 100644 --- a/crenshaw/test.prog +++ b/crenshaw/test.prog @@ -1 +1 @@ -x=(4+4)*3/2-3+a-b*f() +x=(4+4+12)*3/2-3+a-b*func1() |