From 5820deb5559dac39b7da8b18e4ef2e5838f41b66 Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Sat, 18 Aug 2018 14:52:01 +0200 Subject: crenshaw: expansion to multi-digit/letter symbols --- crenshaw/README | 3 +++ crenshaw/main.pas | 38 ++++++++++++++++++++++++++++---------- crenshaw/test.prog | 2 +- 3 files changed, 32 insertions(+), 11 deletions(-) (limited to 'crenshaw') 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() -- cgit v1.2.3-54-g00ecf