From 89e60b4136563c75217e9fc7dabda37e66ef33e3 Mon Sep 17 00:00:00 2001 From: Channa Dias Perera Date: Sat, 20 Jan 2024 00:38:13 +0100 Subject: [PATCH] Syntax Finished --- .gitignore | 1 + src/main/rascal/Syntax.rsc | 141 ++++++++++++++++++++++++------------- src/main/rascal/Test.rsc | 27 +++++++ src/main/rascal/main.rsc | 18 ----- test/input/comment.pas | 8 +++ 5 files changed, 129 insertions(+), 66 deletions(-) create mode 100644 .gitignore create mode 100644 src/main/rascal/Test.rsc delete mode 100644 src/main/rascal/main.rsc create mode 100644 test/input/comment.pas diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2f7896d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +target/ diff --git a/src/main/rascal/Syntax.rsc b/src/main/rascal/Syntax.rsc index 9b200e9..5479a42 100644 --- a/src/main/rascal/Syntax.rsc +++ b/src/main/rascal/Syntax.rsc @@ -1,55 +1,100 @@ module Syntax -extend lang::std::Layout; +extend lang::std::Whitespace; extend lang::std::Id; extend lang::std::ASCII; -start syntax Progarm = 'program' Id ";" ConstDecl* VarDecl* SubProgDecl* CompoundStatement; -syntax ConstDecl = 'const' Id "=" Number; -syntax IdList = Id {"," Id}*; -syntax TypeSpec = BasicType | 'array' "[" Number ".." Number "]" 'of' BasicType; -syntax BasicType = 'integer' | 'real'; -syntax SubProgDecl = 'function' Id Parameters ":" BasicType ";" VarDecl* CompoundStatement ";" | - 'procedure' Id Parameters? ";" VarDecl* CompoundStatement ";" - ; -syntax Parameters = "(" ParameterList ")"; -syntax ParameterList = 'var'? IdList ":" TypeSpec {";" ParameterList}*; +start syntax Program = 'program' Id ";" ConstDecl* VarDecl* SubProgDecl* CompoundStatement "." + ; + +syntax ConstDecl = 'const' Id "=" Number ";" + ; + +syntax VarDecl = 'var' IdList ":" TypeSpec ";" + ; + +syntax IdList = Id ("," Id)* + ; + +syntax TypeSpec = BasicType | 'array' "[" Number ".." Number "]" 'of' BasicType + ; +syntax BasicType = 'integer' | 'real' + ; + +syntax SubProgDecl = 'function' Id Parameters ":" BasicType ";" VarDecl* CompoundStatement ";" + | 'procedure' Id Parameters? ";" VarDecl* CompoundStatement ";" + ; + +syntax Parameters = "(" ParameterList ")" + ; +syntax ParameterList = ParamList + | ParameterList ";" ParamList + ; +syntax ParamList = 'var'? IdList ":" TypeSpec + ; + syntax CompoundStatement = 'begin' StatementList? 'end'; -syntax StatementList = Statement {";" Statement}*; -syntax Statement = Lhs ":=" Expr | - ProcedureCall | - CompoundStatement | - 'skip' | - 'if' Guard 'then' Statement 'else' Statement | - 'while' Guard 'do' Statement - ; - -syntax Guard = Expr Relop Expr | - 'not' Guard | - Guard 'or' Guard | - Guard 'and' GUard | - "(" Guard ")" - ; - -syntax LhsList = Lhs {"," Lhs}*; -syntax Lhs = Id ("[" ExprList "]")?; -syntax ProcedureCall = Id ("(" ExprList ")")? | - 'readln'"(" LhsList ")" | - 'writeln'"(" ExprList ")" - ; -syntax ExprList = Expr {"," Expr}*; -syntax Expr = Id ("[" Expr (".." Expr)?"]")? | - Num | - Id "(" ExprList ")" | - Expr "+" Expr | - Expr "-" Expr | - Expr "*" Expr | - Expr "/" Expr | - Expr 'div' Expr | - Expr 'mod' Expr | - "-" Expr | - "(" Expr ")" - ; + +syntax StatementList = Statement + | StatementList ";" Statement; +syntax Statement = Lhs ":=" Expr + | ProcedureCall + | CompoundStatement + | 'skip' + | 'if' Guard 'then' Statement 'else' Statement + | 'while' Guard 'do' Statement + ; + +syntax Guard = "(" Guard ")" + > Expr Relop Expr + > 'not' Guard + > left ( + Guard 'or' Guard + | Guard 'and' Guard + ) + ; + +syntax LhsList = Lhs ("," Lhs)* + ; +syntax Lhs = Id ("[" Expr "]")? + ; + +syntax ProcedureCall = 'readln'"(" LhsList ")" + | 'writeln'"(" ExprList ")" + > Id \ 'writeln' \ 'readln' \ 'skip' ("(" ExprList ")")? + ; + +syntax ExprList = Expr ("," Expr)* + ; +syntax Expr = "(" Expr ")" + | Id + | Id "[" Expr (".." Expr)?"]" + > Number + | Id "(" ExprList ")" + > "-" Expr + > left ( + Expr "*" Expr + | Expr "/" Expr + | Expr 'div' Expr + | Expr 'mod' Expr + ) + > left ( + Expr "+" Expr + | Expr "-" Expr + ) + ; + +lexical Relop = "\<"|"\<="|"\>"|"\>="|"="|"\<\>"; +lexical Number = Digit+ + | Digit* "." Digit+ + ; +lexical Comment = "{" ![}]* "}"; + -lexical Relop = "\<"|"\<="|"\>"|"\>="|"=="|"!="; -lexical Number = Digit* ("." Digit+)?; \ No newline at end of file +layout Standard + = WhitespaceOrComment* !>> [\u0009-\u000D \u0020 \u0085 \u00A0 \u1680 \u180E \u2000-\u200A \u2028 \u2029 \u202F \u205F \u3000 \ \t\n\r] !>> [{}]; + +lexical WhitespaceOrComment + = whitespace: Whitespace + | comment: Comment + ; diff --git a/src/main/rascal/Test.rsc b/src/main/rascal/Test.rsc new file mode 100644 index 0000000..740338a --- /dev/null +++ b/src/main/rascal/Test.rsc @@ -0,0 +1,27 @@ +module Test + +import ParseTree; +import Syntax; +import IO; + +void main() { + // The input files + list[loc] files = getFilesIn(|project://minipas/test/input|); + for (loc file <- files) { + pt = runSyntaxTestOn(file); + } +} + +/* + Parses the file +*/ +start[Program] runSyntaxTestOn(loc file) { + println("Parsing: "); + pt = parse(#start[Program], file); + + return pt; +} + +list[loc] getFilesIn(loc dir) { + return [|project://minipas/test/input/| | file <- listEntries(dir)]; +} \ No newline at end of file diff --git a/src/main/rascal/main.rsc b/src/main/rascal/main.rsc deleted file mode 100644 index c389794..0000000 --- a/src/main/rascal/main.rsc +++ /dev/null @@ -1,18 +0,0 @@ -module MyTest - -import ParseTree; - -void main() { - [loc] files = getFilesIn(|project://test/input|); - for (loc file <- files) { - runTestOn(file); - } -} - -void runTestOn(loc file) { - println(file); -} - -void getFilesIn(loc dir) { - return |project://test/input/arr.pas|; -} \ No newline at end of file diff --git a/test/input/comment.pas b/test/input/comment.pas new file mode 100644 index 0000000..ede0f8a --- /dev/null +++ b/test/input/comment.pas @@ -0,0 +1,8 @@ +program comm; +{ + comment +} + + +begin +end. \ No newline at end of file