From f3ab1a64b59a398c9fbec9f859a3a89318f241fb Mon Sep 17 00:00:00 2001 From: Mark Olesen <Mark.Olesen@esi-group.com> Date: Fri, 20 Apr 2018 14:41:32 +0200 Subject: [PATCH] BUG: wmkdepend finds 'include' in multi-line comments (closes #784) - the previous grammar used '/*' { fgoto comment; } to start processing multi-line comments and comment := any* :>> '*/' @{ fgoto main; }; as a finishing action to return to normal lexing, but seemed not to have been triggered properly. Now simply trap in a single rule: '/*' any* :>> '*/'; # Multi-line comment STYLE: use more compact dnl (delete to newline) OLD: [^\n]* '\n' NEW: (any* -- '\n') '\n' eliminates the intermediate state --- wmake/src/wmkdepend.cpp | 385 ++++++++++++++-------------------------- wmake/src/wmkdepend.rl | 24 ++- 2 files changed, 151 insertions(+), 258 deletions(-) diff --git a/wmake/src/wmkdepend.cpp b/wmake/src/wmkdepend.cpp index fac76f2d44..4aa8923991 100644 --- a/wmake/src/wmkdepend.cpp +++ b/wmake/src/wmkdepend.cpp @@ -41,6 +41,10 @@ Description ragel -G2 -o wmkdepend.cpp wmkdepend.rl + The FSM can be visualized (eg, in a browser) with the following command + + ragel -V wmkdepend.cpp | dot -Tsvg -owmkdepend.svg + Usage wmkdepend [-Idir..] [-iheader...] [-eENV...] [-oFile] filename @@ -305,7 +309,7 @@ namespace Files // Can use 'variable p xxx;' etc to change these names -#line 334 "wmkdepend.rl" +#line 340 "wmkdepend.rl" @@ -314,15 +318,14 @@ namespace Files // -#line 318 "wmkdepend.cpp" -static const int wmkdep_start = 28; +#line 322 "wmkdepend.cpp" +static const int wmkdep_start = 21; static const int wmkdep_error = 0; -static const int wmkdep_en_comment = 26; -static const int wmkdep_en_main = 28; +static const int wmkdep_en_main = 21; -#line 342 "wmkdepend.rl" +#line 348 "wmkdepend.rl" /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ @@ -345,7 +348,7 @@ void processFile(const std::string& fileName) int act, cs; -#line 349 "wmkdepend.cpp" +#line 352 "wmkdepend.cpp" { cs = wmkdep_start; ts = 0; @@ -353,7 +356,7 @@ void processFile(const std::string& fileName) act = 0; } -#line 363 "wmkdepend.rl" +#line 369 "wmkdepend.rl" /* ^^^ FSM initialization here ^^^ */; // Local token start @@ -398,7 +401,7 @@ void processFile(const std::string& fileName) } -#line 402 "wmkdepend.cpp" +#line 405 "wmkdepend.cpp" { if ( p == pe ) goto _test_eof; @@ -410,70 +413,64 @@ tr0: case 0: {{goto st0;}} break; - case 6: - {{p = ((te))-1;} {goto st26;} } - break; default: {{p = ((te))-1;}} break; } } - goto st28; + goto st21; tr2: -#line 331 "wmkdepend.rl" +#line 337 "wmkdepend.rl" {te = p+1;} - goto st28; + goto st21; tr17: -#line 331 "wmkdepend.rl" +#line 337 "wmkdepend.rl" {{p = ((te))-1;}} - goto st28; + goto st21; tr21: -#line 322 "wmkdepend.rl" - {te = p+1;} - goto st28; -tr28: -#line 326 "wmkdepend.rl" +#line 327 "wmkdepend.rl" {te = p+1;} - goto st28; -tr35: -#line 325 "wmkdepend.rl" + goto st21; +tr29: +#line 330 "wmkdepend.rl" {te = p+1;} - goto st28; -tr39: -#line 328 "wmkdepend.rl" + goto st21; +tr31: +#line 329 "wmkdepend.rl" {te = p+1;} - goto st28; -tr48: -#line 319 "wmkdepend.rl" + goto st21; +tr36: +#line 324 "wmkdepend.rl" {te = p;p--;} - goto st28; -tr49: -#line 331 "wmkdepend.rl" + goto st21; +tr37: +#line 337 "wmkdepend.rl" {te = p;p--;} - goto st28; -st28: + goto st21; +tr38: +#line 330 "wmkdepend.rl" + {te = p;p--;} + goto st21; +st21: #line 1 "NONE" {ts = 0;} #line 1 "NONE" {act = 0;} if ( ++p == pe ) - goto _test_eof28; -case 28: + goto _test_eof21; +case 21: #line 1 "NONE" {ts = p;} #line 465 "wmkdepend.cpp" switch( (*p) ) { - case 10: goto st30; - case 11: goto tr45; - case 32: goto tr43; - case 34: goto st15; + case 10: goto st23; + case 11: goto tr34; + case 32: goto tr32; case 35: goto st2; - case 39: goto st19; - case 47: goto st23; - case 76: goto st25; + case 47: goto st15; } if ( 9 <= (*p) && (*p) <= 13 ) - goto tr43; + goto tr32; goto st1; st1: if ( ++p == pe ) @@ -482,52 +479,52 @@ case 1: if ( (*p) == 10 ) goto tr2; goto st1; -tr43: +tr32: #line 1 "NONE" {te = p+1;} -#line 319 "wmkdepend.rl" +#line 324 "wmkdepend.rl" {act = 1;} - goto st29; -st29: + goto st22; +st22: if ( ++p == pe ) - goto _test_eof29; -case 29: -#line 496 "wmkdepend.cpp" + goto _test_eof22; +case 22: +#line 493 "wmkdepend.cpp" switch( (*p) ) { - case 10: goto st30; - case 11: goto tr45; - case 32: goto tr43; + case 10: goto st23; + case 11: goto tr34; + case 32: goto tr32; case 35: goto st2; } if ( 9 <= (*p) && (*p) <= 13 ) - goto tr43; + goto tr32; goto st1; -st30: +st23: if ( ++p == pe ) - goto _test_eof30; -case 30: + goto _test_eof23; +case 23: if ( (*p) == 32 ) - goto st30; + goto st23; if ( 9 <= (*p) && (*p) <= 13 ) - goto st30; - goto tr48; -tr45: + goto st23; + goto tr36; +tr34: #line 1 "NONE" {te = p+1;} -#line 319 "wmkdepend.rl" +#line 324 "wmkdepend.rl" {act = 1;} - goto st31; -st31: + goto st24; +st24: if ( ++p == pe ) - goto _test_eof31; -case 31: -#line 525 "wmkdepend.cpp" + goto _test_eof24; +case 24: +#line 522 "wmkdepend.cpp" switch( (*p) ) { - case 10: goto st30; - case 32: goto tr45; + case 10: goto st23; + case 32: goto tr34; } if ( 9 <= (*p) && (*p) <= 13 ) - goto tr45; + goto tr34; goto st1; st2: if ( ++p == pe ) @@ -619,14 +616,14 @@ case 10: } goto tr12; tr12: -#line 308 "wmkdepend.rl" +#line 312 "wmkdepend.rl" { tok = p; /* Local token start */ } goto st11; st11: if ( ++p == pe ) goto _test_eof11; case 11: -#line 630 "wmkdepend.cpp" +#line 627 "wmkdepend.cpp" switch( (*p) ) { case 10: goto tr15; case 34: goto tr16; @@ -635,18 +632,18 @@ case 11: tr13: #line 1 "NONE" {te = p+1;} -#line 308 "wmkdepend.rl" +#line 312 "wmkdepend.rl" { tok = p; /* Local token start */ } - goto st32; + goto st25; tr15: #line 1 "NONE" {te = p+1;} - goto st32; -st32: + goto st25; +st25: if ( ++p == pe ) - goto _test_eof32; -case 32: -#line 650 "wmkdepend.cpp" + goto _test_eof25; +case 25: +#line 647 "wmkdepend.cpp" if ( (*p) == 34 ) goto tr19; goto st12; @@ -658,26 +655,26 @@ case 12: goto tr19; goto st12; tr19: -#line 309 "wmkdepend.rl" +#line 313 "wmkdepend.rl" { processFile(std::string(tok, (p - tok))); } goto st13; st13: if ( ++p == pe ) goto _test_eof13; case 13: -#line 669 "wmkdepend.cpp" +#line 666 "wmkdepend.cpp" if ( (*p) == 10 ) goto tr21; goto st13; tr16: -#line 309 "wmkdepend.rl" +#line 313 "wmkdepend.rl" { processFile(std::string(tok, (p - tok))); } goto st14; st14: if ( ++p == pe ) goto _test_eof14; case 14: -#line 681 "wmkdepend.cpp" +#line 678 "wmkdepend.cpp" if ( (*p) == 10 ) goto tr21; goto st14; @@ -687,185 +684,87 @@ st15: case 15: switch( (*p) ) { case 10: goto tr2; - case 34: goto tr24; - case 92: goto st16; + case 42: goto st16; + case 47: goto st20; } - goto st15; -tr24: -#line 1 "NONE" - {te = p+1;} -#line 326 "wmkdepend.rl" - {act = 4;} - goto st33; -tr31: -#line 1 "NONE" - {te = p+1;} -#line 325 "wmkdepend.rl" - {act = 3;} - goto st33; -tr37: -#line 1 "NONE" - {te = p+1;} -#line 329 "wmkdepend.rl" - {act = 6;} - goto st33; -st33: - if ( ++p == pe ) - goto _test_eof33; -case 33: -#line 717 "wmkdepend.cpp" - if ( (*p) == 10 ) - goto tr2; goto st1; st16: if ( ++p == pe ) goto _test_eof16; case 16: - if ( (*p) == 10 ) - goto tr26; - goto st15; -tr26: + switch( (*p) ) { + case 10: goto tr25; + case 42: goto st19; + } + goto st16; +tr25: #line 1 "NONE" {te = p+1;} - goto st34; -st34: + goto st26; +st26: if ( ++p == pe ) - goto _test_eof34; -case 34: -#line 736 "wmkdepend.cpp" - switch( (*p) ) { - case 10: goto tr49; - case 34: goto tr28; - case 92: goto st18; - } + goto _test_eof26; +case 26: +#line 709 "wmkdepend.cpp" + if ( (*p) == 42 ) + goto st18; goto st17; st17: if ( ++p == pe ) goto _test_eof17; case 17: - switch( (*p) ) { - case 10: goto tr17; - case 34: goto tr28; - case 92: goto st18; - } + if ( (*p) == 42 ) + goto st18; goto st17; st18: if ( ++p == pe ) goto _test_eof18; case 18: + switch( (*p) ) { + case 42: goto st18; + case 47: goto tr29; + } goto st17; st19: if ( ++p == pe ) goto _test_eof19; case 19: switch( (*p) ) { - case 10: goto tr2; - case 39: goto tr31; - case 92: goto st20; + case 10: goto tr25; + case 42: goto st19; + case 47: goto tr30; } - goto st19; -st20: - if ( ++p == pe ) - goto _test_eof20; -case 20: - if ( (*p) == 10 ) - goto tr33; - goto st19; -tr33: + goto st16; +tr30: #line 1 "NONE" {te = p+1;} - goto st35; -st35: - if ( ++p == pe ) - goto _test_eof35; -case 35: -#line 783 "wmkdepend.cpp" - switch( (*p) ) { - case 10: goto tr49; - case 39: goto tr35; - case 92: goto st22; - } - goto st21; -st21: - if ( ++p == pe ) - goto _test_eof21; -case 21: - switch( (*p) ) { - case 10: goto tr17; - case 39: goto tr35; - case 92: goto st22; - } - goto st21; -st22: - if ( ++p == pe ) - goto _test_eof22; -case 22: - goto st21; -st23: - if ( ++p == pe ) - goto _test_eof23; -case 23: - switch( (*p) ) { - case 10: goto tr2; - case 42: goto tr37; - case 47: goto st24; - } - goto st1; -st24: - if ( ++p == pe ) - goto _test_eof24; -case 24: - if ( (*p) == 10 ) - goto tr39; - goto st24; -st25: - if ( ++p == pe ) - goto _test_eof25; -case 25: - switch( (*p) ) { - case 10: goto tr2; - case 34: goto st15; - case 39: goto st19; - } - goto st1; -st26: -#line 1 "NONE" - {ts = 0;} - if ( ++p == pe ) - goto _test_eof26; -case 26: -#line 838 "wmkdepend.cpp" - if ( (*p) == 42 ) - goto st27; - goto st26; +#line 330 "wmkdepend.rl" + {act = 4;} + goto st27; st27: if ( ++p == pe ) goto _test_eof27; case 27: - switch( (*p) ) { - case 42: goto st27; - case 47: goto tr42; - } - goto st26; -tr42: -#line 315 "wmkdepend.rl" - { {goto st28;} } - goto st36; -st36: +#line 749 "wmkdepend.cpp" + if ( (*p) == 10 ) + goto tr2; + goto st1; +st20: if ( ++p == pe ) - goto _test_eof36; -case 36: -#line 859 "wmkdepend.cpp" - goto st0; + goto _test_eof20; +case 20: + if ( (*p) == 10 ) + goto tr31; + goto st20; st0: cs = 0; goto _out; } - _test_eof28: cs = 28; goto _test_eof; + _test_eof21: cs = 21; goto _test_eof; _test_eof1: cs = 1; goto _test_eof; - _test_eof29: cs = 29; goto _test_eof; - _test_eof30: cs = 30; goto _test_eof; - _test_eof31: cs = 31; goto _test_eof; + _test_eof22: cs = 22; goto _test_eof; + _test_eof23: cs = 23; goto _test_eof; + _test_eof24: cs = 24; goto _test_eof; _test_eof2: cs = 2; goto _test_eof; _test_eof3: cs = 3; goto _test_eof; _test_eof4: cs = 4; goto _test_eof; @@ -876,36 +775,27 @@ cs = 0; _test_eof9: cs = 9; goto _test_eof; _test_eof10: cs = 10; goto _test_eof; _test_eof11: cs = 11; goto _test_eof; - _test_eof32: cs = 32; goto _test_eof; + _test_eof25: cs = 25; goto _test_eof; _test_eof12: cs = 12; goto _test_eof; _test_eof13: cs = 13; goto _test_eof; _test_eof14: cs = 14; goto _test_eof; _test_eof15: cs = 15; goto _test_eof; - _test_eof33: cs = 33; goto _test_eof; _test_eof16: cs = 16; goto _test_eof; - _test_eof34: cs = 34; goto _test_eof; + _test_eof26: cs = 26; goto _test_eof; _test_eof17: cs = 17; goto _test_eof; _test_eof18: cs = 18; goto _test_eof; _test_eof19: cs = 19; goto _test_eof; - _test_eof20: cs = 20; goto _test_eof; - _test_eof35: cs = 35; goto _test_eof; - _test_eof21: cs = 21; goto _test_eof; - _test_eof22: cs = 22; goto _test_eof; - _test_eof23: cs = 23; goto _test_eof; - _test_eof24: cs = 24; goto _test_eof; - _test_eof25: cs = 25; goto _test_eof; - _test_eof26: cs = 26; goto _test_eof; _test_eof27: cs = 27; goto _test_eof; - _test_eof36: cs = 36; goto _test_eof; + _test_eof20: cs = 20; goto _test_eof; _test_eof: {} if ( p == eof ) { switch ( cs ) { case 1: goto tr0; - case 29: goto tr48; - case 30: goto tr48; - case 31: goto tr48; + case 22: goto tr36; + case 23: goto tr36; + case 24: goto tr36; case 2: goto tr0; case 3: goto tr0; case 4: goto tr0; @@ -916,24 +806,21 @@ cs = 0; case 9: goto tr0; case 10: goto tr0; case 11: goto tr0; - case 32: goto tr49; + case 25: goto tr37; case 12: goto tr17; case 13: goto tr17; case 14: goto tr0; - case 33: goto tr0; - case 34: goto tr49; + case 26: goto tr37; case 17: goto tr17; case 18: goto tr17; - case 35: goto tr49; - case 21: goto tr17; - case 22: goto tr17; + case 27: goto tr38; } } _out: {} } -#line 406 "wmkdepend.rl" +#line 412 "wmkdepend.rl" /* ^^^ FSM execution here ^^^ */; if (0 == cs) diff --git a/wmake/src/wmkdepend.rl b/wmake/src/wmkdepend.rl index 85ee60474e..729ab472ac 100644 --- a/wmake/src/wmkdepend.rl +++ b/wmake/src/wmkdepend.rl @@ -39,6 +39,10 @@ Description ragel -G2 -o wmkdepend.cpp wmkdepend.rl + The FSM can be visualized (eg, in a browser) with the following command + + ragel -V wmkdepend.cpp | dot -Tsvg -owmkdepend.svg + Usage wmkdepend [-Idir..] [-iheader...] [-eENV...] [-oFile] filename @@ -309,24 +313,26 @@ namespace Files action process { processFile(std::string(tok, (p - tok))); } white = [ \t\f\r]; # Horizontal whitespace - nl = white* '\n'; # Newline - dnl = [^\n]* '\n'; # Discard up to and including newline + nl = white* '\n'; # Newline (allow trailing whitespace) + dnl = (any* -- '\n') '\n'; # Discard up to and including newline - comment := any* :>> '*/' @{ fgoto main; }; + dquot = '"'; # double quote + dqarg = (any+ -- dquot); # double quoted argument main := |* space*; # Discard whitespace, empty lines white* '#' white* 'include' white* - ('"' [^\"]+ >buffer %process '"') dnl; + (dquot dqarg >buffer %process dquot) dnl; - # Single and double quoted strings - ( 'L'? "'" ( [^'\\\n] | /\\./ )* "'") ; # " swallow - ( 'L'? '"' ( [^"\\\n] | /\\./ )* '"') ; # ' swallow + '//' dnl; # 1-line comment + '/*' any* :>> '*/'; # Multi-line comment - '//' dnl; # 1-line comment - '/*' { fgoto comment; }; # Multi-line comment + # String handling is currently unused + ### # Single and double quoted strings + ### 'L'? '"' ( /\\./ | [^"\\\n] )* '"'; # ' quoted - discard + ### 'L'? "'" ( /\\./ | [^'\\\n] )* "'"; # " quoted - discard dnl; # Discard all other lines -- GitLab