$use Access Apply Convert StdIO Stream; $use Lexer; $func Main = e; Main = >; $public $func ParseFile e.fname = e.ast; ParseFile e.fname = > :: e.tokens, //, > : e.ast (), e.ast; $public $func GetRAST e.ast = e.ast; GetRAST { /*empty*/ = /*empty*/; t.term e.ast = t.term : { (IDENT t.name VAR) = (VAR t.name); (IDENT t.name CALL e.args) = (CALL t.name ); (SENTENCE t.name (e.patterns) e.exp (WHERE e.assigns)) = (SENTENCE t.name (e.patterns) (LET () )); (PAREN e.exp (WHERE e.assigns)) = (PAREN (LET () )); (e.exp) = (); s.sym = s.sym; } :: t.term, t.term ; }; $func Parse (e.tokens) e.expr = e.ast (e.tokens); Parse { (e.tokens) /*empty*/ = (e.tokens); (e.tokens) t.term e.expr = t.term : { (Get s.func) = : e.ast (e.tokens_rest), e.ast ; (Skip s.tk) = { e.tokens : (s.tk t.pos) e.tokens_rest = ; ; }; (e.expr2) = :: e.ast (e.tokens), (e.ast) ; s.symbol = s.symbol ; }; }; $func Error (e.tokens) e.message = (e.tokens); Error ((e.tk (e.pos)) e) e.message = , $error "Can't parse the program"; $func Program e.tokens = e.ast (e.tokens); Program e.tokens = { e.tokens : (DEC e) e = ; ; }; $func ProgramRest e.tokens = e.ast (e.tokens); ProgramRest e.tokens = { e.tokens : (EOF e) = (); e.tokens : (DEC e) e = ; ; }; $func FunctionDec e.tokens = e.ast (e.tokens); FunctionDec (DEC e) e.tokens = ; $func VarDecAndFuncDef e.tokens = e.ast (e.tokens); VarDecAndFuncDef e.tokens = { e.tokens : (VAR e) e = ; e.tokens : (DEF e) e = ; ; }; $func VariableDec e.tokens = e.ast (e.tokens); VariableDec (VAR e) e.tokens = ; $func VarsDecl e.tokens = e.ast (e.tokens); VarsDecl e.tokens = { e.tokens : (IDENTIFIER e) e = ; ; }; $func VariableDecRest e.tokens = e.ast (e.tokens); VariableDecRest e.tokens = { e.tokens : (DEF e) e = (e.tokens); e.tokens : (IDENTIFIER e) e = ; ; }; $func VariableList e.tokens = e.ast (e.tokens); VariableList e.tokens = { e.tokens : (IDENTIFIER e) e = ; ; }; $func VariableListRest e.tokens = e.ast (e.tokens); VariableListRest e.tokens = { e.tokens : (COLON e) e = (e.tokens); e.tokens : (COMMA e) e.tokens_rest = ; ; }; $func Definition e.tokens = e.ast (e.tokens); Definition e.tokens = { e.tokens : (DEF e) e.tokens_rest = ; }; $func Equation e.tokens = e.ast (e.tokens); Equation e.tokens = { e.tokens : (IDENTIFIER e) e = ; ; }; $func EquationRest e.tokens = e.ast (e.tokens); EquationRest e.tokens = { e.tokens : \{ (EOF e) e; (DEC e) e; } = (e.tokens); e.tokens : (IDENTIFIER e) e = ; ; }; $func PatternList e.tokens = e.ast (e.tokens); PatternList e.tokens = { e.tokens : \{ (IDENTIFIER e) e; (STRING e) e; } = ; ; }; $func Pattern e.tokens = e.ast (e.tokens); Pattern e.tokens = { e.tokens : (STRING e.str t.pos) e.tokens_rest = e.str ; e.tokens : (IDENTIFIER e) e = ; ; }; $func PatConcat e.tokens = e.ast (e.tokens); PatConcat e.tokens = { e.tokens : \{ (COMMA e) e; (RPAR e) e; } = (e.tokens); e.tokens : (CONCAT e) e.tokens_rest = ; ; }; $func PatternListRest e.tokens = e.ast (e.tokens); PatternListRest e.tokens = { e.tokens : (RPAR e) e = (e.tokens); e.tokens : (COMMA e) e.tokens_rest = ; ; }; $func FunctionType e.tokens = e.ast (e.tokens); FunctionType e.tokens = { e.tokens : (IDENTIFIER e) e = ; ; }; $func ConceptListRest e.tokens = e.ast (e.tokens); ConceptListRest e.tokens = { e.tokens : (TO e) e = (e.tokens); e.tokens : (ASTERISK e) e.tokens_rest = ; '">; }; $func Exp e.tokens = e.ast (e.tokens); Exp e.tokens = { e.tokens : (STRING e.str t.pos) e.tokens_rest = e.str ; e.tokens : (IDENTIFIER e) e = ; e.tokens : (LPAR e) e.tokens_rest = ; e.tokens : (IF e) e.tokens_rest = ; ; }; $func ExpWithWhere e.tokens = e.ast (e.tokens); ExpWithWhere e.tokens = { e.tokens : (STRING e.str t.pos) e.tokens_rest = e.str ; e.tokens : (IDENTIFIER e) e = ; e.tokens : (LPAR e) e.tokens_rest = ; e.tokens : (IF e) e.tokens_rest = ; ; }; $func ExpWithWhereOrUndef e.tokens = e.ast (e.tokens); ExpWithWhereOrUndef e.tokens = { e.tokens : (UNDEFINED e) = (UNDEFINED); e.tokens : \{ (IDENTIFIER e) e; (IF e) e; (LPAR e) e; (STRING e) e; } = ; }; $func ExpVarOrFunc e.tokens = e.ast (e.tokens); ExpVarOrFunc e.tokens = { e.tokens : \{ (COMMA e) e; (CONCAT e) e; (ELSE e) e; (RPAR e) e; (SC e) e; (THEN e) e; (WHERE e) e; } = VAR (e.tokens); e.tokens : (LPAR e) e.tokens_rest = ; ; }; $func ArgList e.tokens = e.ast (e.tokens); ArgList e.tokens = { e.tokens : (RPAR e) e = (e.tokens); e.tokens : \{ (IDENTIFIER e) e; (IF e) e; (LPAR e) e; (STRING e) e; } = ; ; }; $func ArgListRest e.tokens = e.ast (e.tokens); ArgListRest e.tokens = { e.tokens : (RPAR e) e = (e.tokens); e.tokens : (COMMA e) e.tokens_rest = ; ; }; $func ExpConcat e.tokens = e.ast (e.tokens); ExpConcat e.tokens = { e.tokens : \{ (COMMA e) e; (ELSE e) e; (RPAR e) e; (SC e) e; (THEN e) e; } = (e.tokens); e.tokens : (CONCAT e) e.tokens_rest = ; ; }; $func ExpConcatOrWhere e.tokens = e.ast (e.tokens); ExpConcatOrWhere e.tokens = { e.tokens : \{ (ELSE e) e; (RPAR e) e; (SC e) e; (THEN e) e; } = (e.tokens); e.tokens : (CONCAT e) e.tokens_rest = ; e.tokens : (WHERE e) e.tokens_rest = ; ; }; $func VarassignList e.tokens = e.ast (e.tokens); VarassignList e.tokens = { e.tokens : (IDENTIFIER e) e = ; ; }; $func VarassignRest e.tokens = e.ast (e.tokens); VarassignRest e.tokens = { e.tokens : \{ (ELSE e) e; (RPAR e) e; (SC e) e; (THEN e) e; } = (e.tokens); e.tokens : (COMMA e) e.tokens_rest = ; ; }; $func Identifier e.tokens = e.ast (e.tokens); Identifier { (IDENTIFIER e.ident t.pos) e.tokens = (e.tokens); e.tokens = ; };