// $Id$ $use Access Apply Box Class Compare Convert List StdIO Table ; $use "rfp_src" ; $box Errors Position Source ; $func Add_Error_wPos (e.pos) e.msg = ; $func Add_Error e.msg = ; $func Add_Warning e.msg = ; $func? Get_Source_Line = e.line ; $func Scan_Token e.line = e.tokens (e.line) ; $func? IsScan_Keyword (e.pos) e.line = (e.token) (e.line) ; $func? IsScan_Number (e.pos) e.line = (e.num) (e.line) ; $func? IsScan_Variable e.line = (e.token) (e.line) ; $func? IsScan_Word e.line = (e.token) (e.line) ; $func? IsScan_QWord e.line = (e.token) (e.line) ; $func? IsScan_Chars e.line = (e.token) (e.line) ; $func Scan_Symbols (e.symbols) (e.line) = (e.string) (e.line) ; $func Scan_Chars_Rest (e.start) (e.line) s.term = (e.string) (e.line) ; $func Skip_Comment e.line = (e.tk) (e.line) ; $func Skip_Line_Comment e.line = (e.tk) (e.line) ; $func? NoDelimiter e.line = ; $func Next_Column = ; $func Next_Row = ; $func Token_Position = e.pos; RFP_Lexer e.source = , >, , () $iter e.tokens :: e.tokens (e.line), e.tokens : e ((e) (EOF)) = (e.tokens) (); Add_Error_wPos (e.pos) e.msg = ; Add_Error e.msg = ) (0 0)) (e.msg))>; Add_Warning e.msg = ) (0 0)) (e.msg))>; Get_Source_Line = > :: e.line, , e.line; Scan_Token e.line = :: e.saved_position, e.line : { /*empty*/ = { /*empty*/ (); (EOF) (); }; s.char1 s.char2 e.rest, \{ s.char1 s.char2 : \{ \{ '::' = DCOLON; '\\?' = STAKE; '\\!' = CUT; '\\{' = '}':e, TLBRACE; } :: s.tk = , (s.tk) (e.rest); '/*' = , ; '//' = , ; }; s.char1 : \{ '\\'; '/'; } = , /*empty*/ (e.rest); }; s.char e.rest, \{ s.char : \{ \{ '(' = LPAREN; ')' = RPAREN; '<' = LBRACKET; '>' = RBRACKET; '{' = LBRACE; '}' = RBRACE; '#' = NOT; '&' = REF; ',' = COMMA; ';' = SEMICOLON; '=' = EQUAL; ':' = COLON; } :: s.tk = , (s.tk) (e.rest); '*' = , ; \{ '\\'; '/'; } = , /*empty*/ (/*empty*/); }; ' \n\r\t' : e s.char e = , /*empty*/ (e.rest); ; ; ; ; ; ; = , /*empty*/ (e.rest); }; } : { /*empty*/ (e.rest) = /*empty*/ (e.rest); (e.tk) (e.rest) = (((e.saved_position) ()) (e.tk)) (e.rest); }; IsScan_Keyword (e.saved_position) '$' e.rest = , :: (e.last) (e.rest), { = ; e.last; } : { 'box' = BOX; 'channel' = CHANNEL; 'const' = CONST; 'error' = ERROR; 'fail' = FAIL; 'func' = FUNC; 'func?' = "FUNC?"; 'tfunc' = TFUNC; 'extern' = EXTERN; 'iter' = ITER; 'l' = L; 'r' = R; 'module' = MODULE; 'string' = STRING; 'table' = TABLE; 'trace' = TRACE; 'traceall' = TRACEALL; 'trap' = TRAP; 'use' = USE; 'import' = IMPORT; 'vector' = VECTOR; 'with' = WITH; e = , ERROR; } :: s.key, { , ;; }, (s.key) (e.rest); IsScan_Number (e.saved_position) s.first e.rest, \{ ; '+-' : e s.first e; } = , :: (e.last) (e.rest), { ; , 0; } :: s.num, { , ;; }, (NUMBER s.num) (e.rest); IsScan_Variable s.first e.rest, s.first : \{ 's' = SVAR; 'e' = EVAR; 'v' = VVAR; 't' = TVAR; } :: s.type = , { e.rest : '.' e.new_rest = , e.new_rest; e.rest; } :: e.rest, ) (e.rest)> :: (e.name) (e.rest), { e.name : /*empty*/ = '$tmp-' >; e.name; } :: e.name, { = ; e.name; } :: e.name, { , ;; }, (s.type e.name) (e.rest); IsScan_Word s.first e.rest, \{ , ) (s.first)>; : e s.first e; } = , ) (e.rest)> :: (e.last) (e.rest), { , ;; }, (WORD s.first e.last) (e.rest); IsScan_QWord '\"' e.rest = , :: (e.word) (e.rest), (QWORD e.word) (e.rest); IsScan_Chars '\'' e.rest = , :: (e.chars) (e.rest), (SYMBOLS e.chars) (e.rest); Scan_Symbols (e.symbols) (e.line) = () (e.line) T $iter { e.line : s.first e.rest, \{ e.symbols : e '0' e, ; e.symbols : e 'A' e, ; e.symbols : e s.first e; }, , (e.string s.first) (e.rest) T; (e.string) (e.line) F; } :: (e.string) (e.line) s.cond, s.cond : F = (e.string) (e.line); Scan_Chars_Rest (e.start) (e.line) s.term = (e.start) (e.line) T $iter { e.l : s.first e.rest, , s.first : { s.term = (e.s) (e.rest) F; '\\' = { e.rest : s.first2 e.rest2, , s.first2 : \{ 't' = (e.s '\t') (e.rest2) T; 'n' = (e.s '\n') (e.rest2) T; 'r' = (e.s '\r') (e.rest2) T; '\\' = (e.s '\\') (e.rest2) T; '\'' = (e.s '\'') (e.rest2) T; '\"' = (e.s '\"') (e.rest2) T; s = , (e.s s.first2) (e.rest2) T; }; (e.s) () T; , (e.s) () F; }; s = (e.s s.first) (e.rest) T; }; , (e.s) () F; } :: (e.s) (e.l) s.cond, s.cond : F, (e.s) (e.l) ; Skip_Comment e.line = (/*empty*/) (e.line) F $iter { e.line : e.com '*/' e.rest = &Next_Column>)> : e, (e.comment (e.com)) (e.rest) T; (e.comment (e.line)) () F; } :: (e.comment) (e.line) s.tag, s.tag : T = (COMMENT e.comment) (e.line); Skip_Line_Comment e.line = &Next_Column>)> : e, (COMMENT e.line) (); NoDelimiter s.first e.rest, \{ ; ; '+-?!_.' : e s.first e; }; Next_Column = >>; Next_Row = >>; Token_Position = ;