include 'ragel.lm' include 'rlreduce.lm' rl ident /( alpha | '_' ) ( alpha | digit | '_' )*/ rl number / digit+ / rl hex_number / '0x' [0-9a-fA-F]+ / rl hex_char / '0x' [0-9a-fA-F]{2} / rl NL / '\n' / rl c_comment / '/*' ( any | NL )* :>> '*/' / rl cpp_comment / '//' [^\n]* NL / rl s_literal / "'" ([^'\\\n] | '\\' (any | NL))* "'" / rl d_literal / '"' ([^"\\] | NL | '\\' (any | NL))* '"' / namespace inline lex literal `fpc `fc `fcurs `ftargs `fentry `fhold `fexec `fgoto `fnext `fcall `fret `fbreak `fncall `fnret `fnbreak token ident /ident/ token number /digit+/ token hex_number /'0x' [0-9a-fA-F]+/ token dec_number /'0x' [0-9a-fA-F]+/ token comment / c_comment | cpp_comment / token string / s_literal | d_literal / token whitespace / ( [ \t] | NL )+ / literal `{ `} `:: `* `, `( `) `; token var_ref / "$" [a-zA-Z_][a-zA-Z_0-9]* / { if GblActionParams { input->push( make_token( typeid, input->pull( match_length ) ) ) } else { # Just pull one char. Don't consume the word because it may # be a keyword. input->push( make_token( typeid, input->pull( 1 ) ) ) } } token c_any / any / end end namespace host lex literal `%%{ token close_inc /'}--%%'/ { input->push( make_token( typeid, input->pull( match_length ) ) ) restoreGlobals() } token close_imp /'}++%%'/ { input->push( make_token( typeid, input->pull( match_length ) ) ) restoreGlobals() } token slr / '%%' [^{] [^\n]* '\n' / { # Translates single line to multi-line input->pull( 2 ) R: str = input->pull( match_length - 3 ) input->push( "}%%" ) input->push( R ) input->push( "%%{" ) } rl NL / '\n' / rl s_literal / "'" ([^'\\\n] | '\\' (any | NL))* "'" / rl d_literal / '"' ([^"\\] | NL | '\\' (any | NL))* '"' / literal `define `= token ident /ident "'"?/ token number /digit+/ token hex_number /'0x' [0-9a-fA-F]+/ token comment / c_comment | cpp_comment / token string / s_literal | d_literal / token whitespace / ( [ \t] | NL )+ / token c_any / any / end def tok [`define whitespace ident whitespace? number] :ImportDefNum | [`define whitespace ident whitespace? string] :ImportDefStr | [ident whitespace? `= whitespace? number] :ImportAssignNum | [ident whitespace? `= whitespace? string] :ImportAssignStr | [`define] :Def | [`=] :Eq | [ident] :Ident | [number] :Number | [hex_number] :HexNumber | [comment] :Comment | [string] :String | [whitespace] :Whitespace | [c_any] :Any end reduction TopLevel # Pass Through. # def tok # [`define ident number] :Def1 # | [`define ident string] :Def2 # | [ident `= number] :Ass1 # | [ident `= string] :Ass2 # [`define whitespace ident whitespace? number] :ImportDefNum # | [`define whitespace ident whitespace? string] :ImportDefStr # | [ident whitespace? `= whitespace? number] :ImportAssignNum # | [ident whitespace? `= whitespace? string] :ImportAssignStr # | [`define] :Def # | [`=] :Eq # | [ident] :Ident # | [number] :Number # | [hex_number] :HexNumber # | [comment] :Comment # | [string] :String # | [whitespace] :Whitespace # | [c_any] :Any host::tok :ImportDefNum { if ( isImport ) { Literal *lit = new Literal( @number, false /* $number->neg */, $number->data, $number->length, Literal::Number ); string name( $ident->data, $ident->length ); import( @ident, name, lit ); } } host::tok :ImportDefStr { if ( isImport ) { Literal *lit = new Literal( @string, false, $string->data, $string->length, Literal::LitString ); string name( $ident->data, $ident->length ); import( @ident, name, lit ); } } host::tok :ImportAssignNum { if ( isImport ) { Literal *lit = new Literal( @number, false /*$number->neg */, $number->data, $number->length, Literal::Number ); string name( $ident->data, $ident->length ); import( @ident, name, lit ); } } host::tok :ImportAssignStr { if ( isImport ) { Literal *lit = new Literal( @string, false, $string->data, $string->length, Literal::LitString ); string name( $ident->data, $ident->length ); import( @ident, name, lit ); } } end export RagelError: str # File name. The open is expected to succeed. It is tested before the colm # program is called. A: list_el = argv->pop_head_el() GblFileName = A->value # Remaining items are include paths. while ( argv->length > 0 ) { A = argv->pop_head_el() GblIncludePaths->push_tail_el( A ) } Stream: stream = open( GblFileName, "r" ) reduce TopLevel start[ Stream ] RagelError = error