Syntax Finished
parent
f23a84e409
commit
89e60b4136
@ -0,0 +1 @@
|
||||
target/
|
@ -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+)?;
|
||||
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
|
||||
;
|
||||
|
@ -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: <file>");
|
||||
pt = parse(#start[Program], file);
|
||||
|
||||
return pt;
|
||||
}
|
||||
|
||||
list[loc] getFilesIn(loc dir) {
|
||||
return [|project://minipas/test/input/<file>| | file <- listEntries(dir)];
|
||||
}
|
@ -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|;
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
program comm;
|
||||
{
|
||||
comment
|
||||
}
|
||||
|
||||
|
||||
begin
|
||||
end.
|
Loading…
Reference in New Issue