summaryrefslogtreecommitdiff
path: root/crenshaw
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2018-08-18 14:52:01 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2018-08-18 14:52:01 +0200
commit5820deb5559dac39b7da8b18e4ef2e5838f41b66 (patch)
tree1e262f50850567b4f3393dcc91a52d62899ef1ea /crenshaw
parenta3b01d933dc061fd9c24dd2caf121fe92c497d76 (diff)
downloadcompilertests-5820deb5559dac39b7da8b18e4ef2e5838f41b66.tar.gz
compilertests-5820deb5559dac39b7da8b18e4ef2e5838f41b66.tar.bz2
crenshaw: expansion to multi-digit/letter symbols
Diffstat (limited to 'crenshaw')
-rw-r--r--crenshaw/README3
-rw-r--r--crenshaw/main.pas38
-rw-r--r--crenshaw/test.prog2
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()