diff options
Diffstat (limited to 'test/ragel.d/cppscan4.rl')
-rw-r--r-- | test/ragel.d/cppscan4.rl | 301 |
1 files changed, 0 insertions, 301 deletions
diff --git a/test/ragel.d/cppscan4.rl b/test/ragel.d/cppscan4.rl deleted file mode 100644 index 9fb2f10c..00000000 --- a/test/ragel.d/cppscan4.rl +++ /dev/null @@ -1,301 +0,0 @@ -/* - * @LANG: d - */ - -module cppscan; - -import std.c.stdio; -import std.stdio; -import std.string; - -const int BUFSIZE = 2048; - -const int TK_Dlit = 192; -const int TK_Slit = 193; -const int TK_Float = 194; -const int TK_Id = 195; -const int TK_NameSep = 197; -const int TK_Arrow = 211; -const int TK_PlusPlus = 212; -const int TK_MinusMinus = 213; -const int TK_ArrowStar = 214; -const int TK_DotStar = 215; -const int TK_ShiftLeft = 216; -const int TK_ShiftRight = 217; -const int TK_IntegerDecimal = 218; -const int TK_IntegerOctal = 219; -const int TK_IntegerHex = 220; -const int TK_EqualsEquals = 223; -const int TK_NotEquals = 224; -const int TK_AndAnd = 225; -const int TK_OrOr = 226; -const int TK_MultAssign = 227; -const int TK_DivAssign = 228; -const int TK_PercentAssign = 229; -const int TK_PlusAssign = 230; -const int TK_MinusAssign = 231; -const int TK_AmpAssign = 232; -const int TK_CaretAssign = 233; -const int TK_BarAssign = 234; -const int TK_DotDotDot = 240; - - -class Scanner -{ - int line, col; - int tokStart; - int inlineDepth; - int count; - const (char)[] tokBuf; - const (char)[] nonTokBuf; - - void pass(char c) { nonTokBuf ~= c; } - void buf(char c) { tokBuf ~= c; } - void token( int id ) - { - /* Leader. */ - if ( nonTokBuf.length > 0 ) { - writef("%s", cast(string)nonTokBuf); - nonTokBuf = ""; - } - - /* Token data. */ - writef("<%d>%s", id, cast(string)tokBuf); - - tokBuf = ""; - } - - int cs, stack, top; - - %%{ - machine Scanner; - - action pass { pass(fc); } - action buf { buf(fc); } - - action emit_slit { token( TK_Slit ); } - action emit_dlit { token( TK_Dlit ); } - action emit_id { token( TK_Id ); } - action emit_integer_decimal { token( TK_IntegerDecimal ); } - action emit_integer_octal { token( TK_IntegerOctal ); } - action emit_integer_hex { token( TK_IntegerHex ); } - action emit_float { token( TK_Float ); } - action emit_symbol { token( tokBuf[0] ); } - action tokst { tokStart = col; } - - # Single and double literals. - slit = ( 'L'? ( "'" ( [^'\\\n] | /\\./ )* "'" ) $buf ) >tokst %emit_slit; - dlit = ( 'L'? ( '"' ( [^"\\\n] | /\\./ )* '"' ) $buf ) >tokst %emit_dlit; - - # Identifiers - id = ( [a-zA-Z_] [a-zA-Z0-9_]* ) >tokst $buf %emit_id; - - # Floating literals. - fract_const = digit* '.' digit+ | digit+ '.'; - exponent = [eE] [+\-]? digit+; - float_suffix = [flFL]; - float = - ( fract_const exponent? float_suffix? | - digit+ exponent float_suffix? ) >tokst $buf %emit_float; - - # Integer decimal. Leading part buffered by float. - integer_decimal = ( ( '0' | [1-9] [0-9]* ) [ulUL]{0,3} $buf ) %emit_integer_decimal; - - # Integer octal. Leading part buffered by float. - integer_octal = ( '0' [0-9]+ [ulUL]{0,2} $buf ) %emit_integer_octal; - - # Integer hex. Leading 0 buffered by float. - integer_hex = ( '0' ( 'x' [0-9a-fA-F]+ [ulUL]{0,2} ) $buf ) %emit_integer_hex; - - # Only buffer the second item, first buffered by symbol. */ - namesep = '::' @buf %{token( TK_NameSep );}; - deqs = '==' @buf %{token( TK_EqualsEquals );}; - neqs = '!=' @buf %{token( TK_NotEquals );}; - and_and = '&&' @buf %{token( TK_AndAnd );}; - or_or = '||' @buf %{token( TK_OrOr );}; - mult_assign = '*=' @buf %{token( TK_MultAssign );}; - percent_assign = '%=' @buf %{token( TK_PercentAssign );}; - plus_assign = '+=' @buf %{token( TK_PlusAssign );}; - minus_assign = '-=' @buf %{token( TK_MinusAssign );}; - amp_assign = '&=' @buf %{token( TK_AmpAssign );}; - caret_assign = '^=' @buf %{token( TK_CaretAssign );}; - bar_assign = '|=' @buf %{token( TK_BarAssign );}; - plus_plus = '++' @buf %{token( TK_PlusPlus );}; - minus_minus = '--' @buf %{token( TK_MinusMinus );}; - arrow = '->' @buf %{token( TK_Arrow );}; - arrow_star = '->*' @buf %{token( TK_ArrowStar );}; - dot_star = '.*' @buf %{token( TK_DotStar );}; - - # Buffer both items. * - div_assign = '/=' @{buf('/');buf(fc);} %{token( TK_DivAssign );}; - - # Double dot is sent as two dots. - dot_dot = '..' %{token('.'); buf('.'); token('.');}; - - # Three char compounds, first item already buffered. */ - dot_dot_dot = '...' %{buf('.'); buf('.'); token( TK_DotDotDot );}; - - # All compunds - compound = namesep | deqs | neqs | and_and | or_or | mult_assign | - div_assign | percent_assign | plus_assign | minus_assign | - amp_assign | caret_assign | bar_assign | plus_plus | minus_minus | - arrow | arrow_star | dot_star | dot_dot | dot_dot_dot; - - # Single char symbols. - symbol = - ( punct - [./_"'] ) >tokst $buf %emit_symbol | - # Do not immediately buffer slash, may be start of comment. - '/' >tokst %{ buf('/'); token( '/' ); } | - # Dot covered by float. - '.' %emit_symbol; - - # Comments and whitespace. - commc = '/*' @{pass('/'); pass('*');} ( any* $0 '*/' @1 ) $pass; - commcc = '//' @{pass('/'); pass('/');} ( any* $0 '\n' @1 ) $pass; - whitespace = ( any - ( 0 | 33..126 ) )+ $pass; - - action onEOFChar { - /* On EOF char, write out the non token buffer. */ - writef("%s", cast(string)nonTokBuf); - nonTokBuf = ""; - } - - # Using 0 as eof. If seeingAs a result all null characters get ignored. - EOF = 0 @onEOFChar; - - # All outside code tokens. - tokens = ( - id | slit | dlit | float | integer_decimal | - integer_octal | integer_hex | compound | symbol ); - nontok = ( commc | commcc | whitespace | EOF ); - - position = ( - '\n' @{ line += 1; col = 1; } | - [^\n] @{ col += 1; } )*; - - main := ( ( tokens | nontok )** ) & position; - }%% - - %% write data noprefix; - - void init( ) - { - /* A count of the number of characters in - * a token. Used for % sequences. */ - count = 0; - line = 1; - col = 1; - %% write init; - } - - int execute( const(char)* _data, ulong _len ) - { - const(char) *p = _data; - const(char) *pe = _data + _len; - const(char) *eof = null; - - %% write exec; - - if ( cs == error ) - return -1; - if ( cs >= first_final ) - return 1; - return 0; - } - - // Indicate that there is no more data. Returns -1 if the machine finishes - // in the error state and does not accept, 0 if the machine finishes - // in any other non-accepting state and 1 if the machine finishes in an - // accepting state. - int finish( ) - { - if ( cs == error ) - return -1; - if ( cs >= first_final ) - return 1; - return 0; - } -}; - -void test(const(char)[] buf) -{ - Scanner scanner = new Scanner(); - scanner.init(); - scanner.execute( buf.ptr, buf.length ); - - /* The last token is ignored (because there is no next token). Send - * trailing null to force the last token into whitespace. */ - const(char) eof_char = 0; - if ( scanner.execute( &eof_char, 1 ) <= 0 ) { - std.stdio.stderr.writef("cppscan: scan failed\n"); - } -} - -int main() -{ - test( - "/*\n" - " * Copyright \n" - " */\n" - "\n" - "RedTransAp *RedFsmAp::reduceTrans( TransAp *trans )\n" - "{\n" - " RedAction *action = 0;\n" - " if ( trans->actionTable.length() > 0 ) {\n" - " if ( actionMap.insert( trans->actionTable, &action ) )\n" - " action->id = nextActionId++;\n" - " }\n" - " \n" - " RedStateAp *targ = (RedStateAp*)trans->toState;\n" - " if ( action == 0 ) {\n" - " delete trans;\n" - " return 0;\n" - " }\n" - "\n" - " trans->~TransAp();\n" - " inDict = new(trans) RedTransAp( targ, action, nextTransId++ );\n" - " transSet.insert( inDict );\n" - "}\n" - ); - - test( - "->*\n" - ".*\n" - "/*\"*/\n" - "\"/*\"\n" - "L'\"'\n" - "L\"'\"\n" - ); - - return 0; -} - -##### OUTPUT ##### -/* - * Copyright - */ - -<195>RedTransAp <42>*<195>RedFsmAp<197>::<195>reduceTrans<40>( <195>TransAp <42>*<195>trans <41>) -<123>{ - <195>RedAction <42>*<195>action <61>= <218>0<59>; - <195>if <40>( <195>trans<211>-><195>actionTable<46>.<195>length<40>(<41>) <62>> <218>0 <41>) <123>{ - <195>if <40>( <195>actionMap<46>.<195>insert<40>( <195>trans<211>-><195>actionTable<44>, <38>&<195>action <41>) <41>) - <195>action<211>-><195>id <61>= <195>nextActionId<212>++<59>; - <125>} - - <195>RedStateAp <42>*<195>targ <61>= <40>(<195>RedStateAp<42>*<41>)<195>trans<211>-><195>toState<59>; - <195>if <40>( <195>action <223>== <218>0 <41>) <123>{ - <195>delete <195>trans<59>; - <195>return <218>0<59>; - <125>} - - <195>trans<211>-><126>~<195>TransAp<40>(<41>)<59>; - <195>inDict <61>= <195>new<40>(<195>trans<41>) <195>RedTransAp<40>( <195>targ<44>, <195>action<44>, <195>nextTransId<212>++ <41>)<59>; - <195>transSet<46>.<195>insert<40>( <195>inDict <41>)<59>; -<125>} -<214>->* -<215>.* -/*"*/ -<192>"/*" -<193>L'"' -<192>L"'" |