From f2c07ba8217ba5d004aa1da7ec7d3b3a67f109da Mon Sep 17 00:00:00 2001 From: "P. J. Reed" Date: Tue, 27 Aug 2019 17:26:25 +0000 Subject: [PATCH 1/2] Treat __name the same as __node This modifies the lexer so that it will accept __name and treat it exactly the same as __node. __node still works in order to preserve backwards compatibility. Fixes #258 Distribution Statement A; OPSEC #2893 Signed-off-by: P. J. Reed --- rcl/include/rcl/lexer.h | 2 +- rcl/src/rcl/arguments.c | 2 +- rcl/src/rcl/lexer.c | 285 +++++++++++++++++++----------------- rcl/test/rcl/test_lexer.cpp | 15 +- 4 files changed, 165 insertions(+), 139 deletions(-) diff --git a/rcl/include/rcl/lexer.h b/rcl/include/rcl/lexer.h index d87a85acd..831f145c3 100644 --- a/rcl/include/rcl/lexer.h +++ b/rcl/include/rcl/lexer.h @@ -42,7 +42,7 @@ typedef enum rcl_lexeme_t RCL_LEXEME_URL_TOPIC = 4, /// : RCL_LEXEME_COLON = 5, - /// __node + /// __node or __name RCL_LEXEME_NODE = 6, /// __ns RCL_LEXEME_NS = 7, diff --git a/rcl/src/rcl/arguments.c b/rcl/src/rcl/arguments.c index 12f157af6..09f40b790 100644 --- a/rcl/src/rcl/arguments.c +++ b/rcl/src/rcl/arguments.c @@ -951,7 +951,7 @@ _rcl_parse_remap_namespace_replacement( return RCL_RET_OK; } -/// Parse a nodename replacement rule (ex: `__node:=new_name`). +/// Parse a nodename replacement rule (ex: `__node:=new_name` or `__name:=new_name`). /** * \sa _rcl_parse_remap_begin_remap_rule() */ diff --git a/rcl/src/rcl/lexer.c b/rcl/src/rcl/lexer.c index dd4445361..8af4ae389 100644 --- a/rcl/src/rcl/lexer.c +++ b/rcl/src/rcl/lexer.c @@ -81,56 +81,58 @@ digraph remapping_lexer { S4 -> S5 [ label = "n" ]; S5 -> T_NS [ label = "s"]; S5 -> S6 [ label = "o" ]; - S6 -> S7 [ label = "d" ]; - S7 -> T_NODE [ label = "e"]; - S8 -> T_TOKEN [ label = "", color=crimson, fontcolor=crimson]; - S8 -> S8 [ label = "a-zA-Z0-9"]; - S8 -> S9 [ label = "_"]; + S6 -> S9 [ label = "d" ]; + S5 -> S7 [ label = "a" ]; + S7 -> S8 [ label = "m" ]; + S8 -> T_NODE [ label = "e"]; S9 -> T_TOKEN [ label = "", color=crimson, fontcolor=crimson]; - S9 -> S8 [ label = "a-zA-Z0-9"]; - S10 -> S8 [ label = "", color=crimson, fontcolor=crimson]; - S10 -> S11 [ label = "o"]; - S11 -> S8 [ label = "", color=crimson, fontcolor=crimson]; - S11 -> S12 [ label = "s"]; - S12 -> S8 [ label = "", color=crimson, fontcolor=crimson]; - S12 -> S13 [ label = "t"]; - S12 -> S20 [ label = "s"]; - S13 -> S8 [ label = "", color=crimson, fontcolor=crimson]; - S13 -> S14 [ label = "o"]; - S14 -> S8 [ label = "", color=crimson, fontcolor=crimson]; - S14 -> S15 [ label = "p"]; - S15 -> S8 [ label = "", color=crimson, fontcolor=crimson]; - S15 -> S16 [ label = "i"]; - S16 -> S8 [ label = "", color=crimson, fontcolor=crimson]; - S16 -> S17 [ label = "c"]; - S17 -> S8 [ label = "", color=crimson, fontcolor=crimson]; - S17 -> S18 [ label = ":"]; - S18 -> S19 [ label = "/"]; - S18 -> S8 [ label = "", color=crimson, fontcolor=crimson]; - S19 -> T_URL_TOPIC [ label = "/"]; - S19 -> S8 [ label = "", color=crimson, fontcolor=crimson]; - S20 -> S8 [ label = "", color=crimson, fontcolor=crimson]; - S20 -> S21 [ label = "e"]; - S21 -> S8 [ label = "", color=crimson, fontcolor=crimson]; - S21 -> S22 [ label = "r"]; - S22 -> S8 [ label = "", color=crimson, fontcolor=crimson]; - S22 -> S23 [ label = "v"]; - S23 -> S8 [ label = "", color=crimson, fontcolor=crimson]; - S23 -> S24 [ label = "i"]; - S24 -> S8 [ label = "", color=crimson, fontcolor=crimson]; - S24 -> S25 [ label = "c"]; - S25 -> S8 [ label = "", color=crimson, fontcolor=crimson]; - S25 -> S26 [ label = "e"]; - S26 -> S27 [ label = ":"]; - S26 -> S8 [ label = "", color=crimson, fontcolor=crimson]; - S27 -> S28 [ label = "/"]; - S27 -> S8 [ label = "", color=crimson, fontcolor=crimson]; - S28 -> T_URL_SERVICE [ label = "/"]; - S28 -> S8 [ label = "", color=crimson, fontcolor=crimson]; - S29 -> T_WILD_MULTI[ label = "*"]; - S29 -> T_WILD_ONE [ label = "", color=crimson, fontcolor=crimson]; - S30 -> T_SEPARATOR [ label = "="]; - S30 -> T_COLON [ label = "", color=crimson, fontcolor=crimson]; + S9 -> S9 [ label = "a-zA-Z0-9"]; + S9 -> S10 [ label = "_"]; + S10 -> T_TOKEN [ label = "", color=crimson, fontcolor=crimson]; + S10 -> S9 [ label = "a-zA-Z0-9"]; + S11 -> S9 [ label = "", color=crimson, fontcolor=crimson]; + S11 -> S12 [ label = "o"]; + S12 -> S9 [ label = "", color=crimson, fontcolor=crimson]; + S12 -> S13 [ label = "s"]; + S13 -> S9 [ label = "", color=crimson, fontcolor=crimson]; + S13 -> S14 [ label = "t"]; + S13 -> S21 [ label = "s"]; + S14 -> S9 [ label = "", color=crimson, fontcolor=crimson]; + S14 -> S15 [ label = "o"]; + S15 -> S9 [ label = "", color=crimson, fontcolor=crimson]; + S15 -> S16 [ label = "p"]; + S16 -> S9 [ label = "", color=crimson, fontcolor=crimson]; + S16 -> S17 [ label = "i"]; + S17 -> S9 [ label = "", color=crimson, fontcolor=crimson]; + S17 -> S18 [ label = "c"]; + S18 -> S9 [ label = "", color=crimson, fontcolor=crimson]; + S18 -> S19 [ label = ":"]; + S19 -> S20 [ label = "/"]; + S19 -> S9 [ label = "", color=crimson, fontcolor=crimson]; + S20 -> T_URL_TOPIC [ label = "/"]; + S20 -> S9 [ label = "", color=crimson, fontcolor=crimson]; + S21 -> S9 [ label = "", color=crimson, fontcolor=crimson]; + S21 -> S22 [ label = "e"]; + S22 -> S9 [ label = "", color=crimson, fontcolor=crimson]; + S22 -> S23 [ label = "r"]; + S23 -> S9 [ label = "", color=crimson, fontcolor=crimson]; + S23 -> S24 [ label = "v"]; + S24 -> S9 [ label = "", color=crimson, fontcolor=crimson]; + S24 -> S25 [ label = "i"]; + S25 -> S9 [ label = "", color=crimson, fontcolor=crimson]; + S25 -> S26 [ label = "c"]; + S26 -> S9 [ label = "", color=crimson, fontcolor=crimson]; + S26 -> S27 [ label = "e"]; + S27 -> S28 [ label = ":"]; + S27 -> S9 [ label = "", color=crimson, fontcolor=crimson]; + S28 -> S29 [ label = "/"]; + S28 -> S9 [ label = "", color=crimson, fontcolor=crimson]; + S29 -> T_URL_SERVICE [ label = "/"]; + S29 -> S9 [ label = "", color=crimson, fontcolor=crimson]; + S30 -> T_WILD_MULTI[ label = "*"]; + S30 -> T_WILD_ONE [ label = "", color=crimson, fontcolor=crimson]; + S31 -> T_SEPARATOR [ label = "="]; + S31 -> T_COLON [ label = "", color=crimson, fontcolor=crimson]; } */ @@ -189,30 +191,31 @@ typedef struct rcl_lexer_state_t #define S28 28u #define S29 29u #define S30 30u -#define LAST_STATE S30 +#define S31 31u +#define LAST_STATE S31 -#define T_TILDE_SLASH 31u -#define T_URL_SERVICE 32u -#define T_URL_TOPIC 33u -#define T_COLON 34u -#define T_NODE 35u -#define T_NS 36u -#define T_SEPARATOR 37u -#define T_BR1 38u -#define T_BR2 39u -#define T_BR3 40u -#define T_BR4 41u -#define T_BR5 42u -#define T_BR6 43u -#define T_BR7 44u -#define T_BR8 45u -#define T_BR9 46u -#define T_TOKEN 47u -#define T_FORWARD_SLASH 48u -#define T_WILD_ONE 49u -#define T_WILD_MULTI 50u -#define T_EOF 51u -#define T_NONE 52u +#define T_TILDE_SLASH 32u +#define T_URL_SERVICE 33u +#define T_URL_TOPIC 34u +#define T_COLON 35u +#define T_NODE 36u +#define T_NS 37u +#define T_SEPARATOR 38u +#define T_BR1 39u +#define T_BR2 40u +#define T_BR3 41u +#define T_BR4 42u +#define T_BR5 43u +#define T_BR6 44u +#define T_BR7 45u +#define T_BR8 46u +#define T_BR9 47u +#define T_TOKEN 48u +#define T_FORWARD_SLASH 49u +#define T_WILD_ONE 50u +#define T_WILD_MULTI 51u +#define T_EOF 52u +#define T_NONE 53u // used to figure out if a state is terminal or not #define FIRST_TERMINAL T_TILDE_SLASH @@ -232,12 +235,12 @@ static const rcl_lexer_state_t g_states[LAST_STATE + 1] = {S1, '\\', '\\'}, {S2, '~', '~'}, {S3, '_', '_'}, - {S8, 'a', 'q'}, - {S8, 's', 'z'}, - {S8, 'A', 'Z'}, - {S10, 'r', 'r'}, - {S29, '*', '*'}, - {S30, ':', ':'}, + {S9, 'a', 'q'}, + {S9, 's', 'z'}, + {S9, 'A', 'Z'}, + {S11, 'r', 'r'}, + {S30, '*', '*'}, + {S31, ':', ':'}, END_TRANSITIONS } }, @@ -269,7 +272,7 @@ static const rcl_lexer_state_t g_states[LAST_STATE + 1] = }, // S3 { - S9, + S10, 1u, { {S4, '_', '_'}, @@ -292,6 +295,7 @@ static const rcl_lexer_state_t g_states[LAST_STATE + 1] = { {T_NS, 's', 's'}, {S6, 'o', 'o'}, + {S7, 'a', 'a'}, END_TRANSITIONS } }, @@ -300,7 +304,7 @@ static const rcl_lexer_state_t g_states[LAST_STATE + 1] = T_NONE, 0u, { - {S7, 'd', 'd'}, + {S8, 'd', 'd'}, END_TRANSITIONS } }, @@ -309,19 +313,16 @@ static const rcl_lexer_state_t g_states[LAST_STATE + 1] = T_NONE, 0u, { - {T_NODE, 'e', 'e'}, + {S8, 'm', 'm'}, END_TRANSITIONS } }, // S8 { - T_TOKEN, - 1u, + T_NONE, + 0u, { - {S8, 'a', 'z'}, - {S8, 'A', 'Z'}, - {S8, '0', '9'}, - {S9, '_', '_'}, + {T_NODE, 'e', 'e'}, END_TRANSITIONS } }, @@ -330,185 +331,197 @@ static const rcl_lexer_state_t g_states[LAST_STATE + 1] = T_TOKEN, 1u, { - {S8, 'a', 'z'}, - {S8, 'A', 'Z'}, - {S8, '0', '9'}, + {S9, 'a', 'z'}, + {S9, 'A', 'Z'}, + {S9, '0', '9'}, + {S10, '_', '_'}, END_TRANSITIONS } }, // S10 { - S8, + T_TOKEN, 1u, { - {S11, 'o', 'o'}, + {S9, 'a', 'z'}, + {S9, 'A', 'Z'}, + {S9, '0', '9'}, END_TRANSITIONS } }, // S11 { - S8, + S9, 1u, { - {S12, 's', 's'}, + {S12, 'o', 'o'}, END_TRANSITIONS } }, // S12 { - S8, + S9, 1u, { - {S13, 't', 't'}, - {S20, 's', 's'}, + {S13, 's', 's'}, END_TRANSITIONS } }, // S13 { - S8, + S9, 1u, { - {S14, 'o', 'o'}, + {S14, 't', 't'}, + {S21, 's', 's'}, END_TRANSITIONS } }, // S14 { - S8, + S9, 1u, { - {S15, 'p', 'p'}, + {S15, 'o', 'o'}, END_TRANSITIONS } }, // S15 { - S8, + S9, 1u, { - {S16, 'i', 'i'}, + {S16, 'p', 'p'}, END_TRANSITIONS } }, // S16 { - S8, + S9, 1u, { - {S17, 'c', 'c'}, + {S17, 'i', 'i'}, END_TRANSITIONS } }, // S17 { - S8, + S9, 1u, { - {S18, ':', ':'}, + {S18, 'c', 'c'}, END_TRANSITIONS } }, // S18 { - S8, - 2u, + S9, + 1u, { - {S19, '/', '/'}, + {S19, ':', ':'}, END_TRANSITIONS } }, // S19 { - S8, - 3u, + S9, + 2u, { - {T_URL_TOPIC, '/', '/'}, + {S20, '/', '/'}, END_TRANSITIONS } }, // S20 { - S8, - 1u, + S9, + 3u, { - {S21, 'e', 'e'}, + {T_URL_TOPIC, '/', '/'}, END_TRANSITIONS } }, // S21 { - S8, + S9, 1u, { - {S22, 'r', 'r'}, + {S22, 'e', 'e'}, END_TRANSITIONS } }, - // S22 + // S21 { - S8, + S9, 1u, { - {S23, 'v', 'v'}, + {S23, 'r', 'r'}, END_TRANSITIONS } }, // S23 { - S8, + S9, 1u, { - {S24, 'i', 'i'}, + {S24, 'v', 'v'}, END_TRANSITIONS } }, // S24 { - S8, + S9, 1u, { - {S25, 'c', 'c'}, + {S25, 'i', 'i'}, END_TRANSITIONS } }, // S25 { - S8, + S9, 1u, { - {S26, 'e', 'e'}, + {S26, 'c', 'c'}, END_TRANSITIONS } }, // S26 { - S8, + S9, 1u, { - {S27, ':', ':'}, + {S27, 'e', 'e'}, END_TRANSITIONS } }, // S27 { - S8, - 2u, + S9, + 1u, { - {S28, '/', '/'}, + {S28, ':', ':'}, END_TRANSITIONS } }, // S28 { - S8, + S9, + 2u, + { + {S29, '/', '/'}, + END_TRANSITIONS + } + }, + // S29 + { + S9, 3u, { {T_URL_SERVICE, '/', '/'}, END_TRANSITIONS } }, - // S29 + // S30 { T_WILD_ONE, 1u, @@ -517,7 +530,7 @@ static const rcl_lexer_state_t g_states[LAST_STATE + 1] = END_TRANSITIONS } }, - // S30 + // S31 { T_COLON, 1u, @@ -525,7 +538,7 @@ static const rcl_lexer_state_t g_states[LAST_STATE + 1] = {T_SEPARATOR, '=', '='}, END_TRANSITIONS } - }, + } }; static const rcl_lexeme_t g_terminals[LAST_TERMINAL + 1] = { diff --git a/rcl/test/rcl/test_lexer.cpp b/rcl/test/rcl/test_lexer.cpp index 6fd4ee10e..ee2dc1fe1 100644 --- a/rcl/test/rcl/test_lexer.cpp +++ b/rcl/test/rcl/test_lexer.cpp @@ -324,6 +324,19 @@ TEST_F(CLASSNAME(TestLexerFixture, RMW_IMPLEMENTATION), test_ns) EXPECT_LEX(RCL_LEXEME_NONE, "__n!", "__n!"); } +TEST_F(CLASSNAME(TestLexerFixture, RMW_IMPLEMENTATION), test_name) +{ + // Has __name + EXPECT_LEX(RCL_LEXEME_NODE, "__name", "__name"); + EXPECT_LEX(RCL_LEXEME_NODE, "__name", "__namessss"); + + // Things that are almost __name + EXPECT_LEX(RCL_LEXEME_NONE, "__na", "__na"); + EXPECT_LEX(RCL_LEXEME_NONE, "__naa", "__naa"); + EXPECT_LEX(RCL_LEXEME_NONE, "__nam", "__nam"); + EXPECT_LEX(RCL_LEXEME_NONE, "__nama", "__nama"); +} + TEST_F(CLASSNAME(TestLexerFixture, RMW_IMPLEMENTATION), test_node) { // Has __node @@ -333,7 +346,7 @@ TEST_F(CLASSNAME(TestLexerFixture, RMW_IMPLEMENTATION), test_node) // Things that are almost __node EXPECT_LEX(RCL_LEXEME_NONE, "__", "__"); EXPECT_LEX(RCL_LEXEME_NONE, "__n", "__n"); - EXPECT_LEX(RCL_LEXEME_NONE, "__na", "__na"); + EXPECT_LEX(RCL_LEXEME_NONE, "__ne", "__ne"); EXPECT_LEX(RCL_LEXEME_NONE, "__no", "__no"); EXPECT_LEX(RCL_LEXEME_NONE, "__noa", "__noa"); EXPECT_LEX(RCL_LEXEME_NONE, "__nod", "__nod"); From 4740066f4b3f49136e52891df04b7bb56942cda2 Mon Sep 17 00:00:00 2001 From: "P. J. Reed" Date: Mon, 4 Nov 2019 14:08:24 -0600 Subject: [PATCH 2/2] Update dot graph for lexer Distribution Statement A; OPSEC #2893 Signed-off-by: P. J. Reed --- rcl/src/rcl/lexer.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/rcl/src/rcl/lexer.c b/rcl/src/rcl/lexer.c index 65e9100f9..0442048c6 100644 --- a/rcl/src/rcl/lexer.c +++ b/rcl/src/rcl/lexer.c @@ -64,10 +64,10 @@ digraph remapping_lexer { S0 -> S1 [ label = "\\"]; S0 -> S2 [ label = "~"]; S0 -> S3 [ label = "_" ]; - S0 -> S8 [ label = "a-qs-zA-Z"]; - S0 -> S10 [ label = "r"]; - S0 -> S29 [ label = "*"]; - S0 -> S30 [ label = ":"]; + S0 -> S9 [ label = "a-qs-zA-Z"]; + S0 -> S11 [ label = "r"]; + S0 -> S30 [ label = "*"]; + S0 -> S31 [ label = ":"]; S1 -> T_BR1 [ label = "1"]; S1 -> T_BR2 [ label = "2"]; S1 -> T_BR3 [ label = "3"]; @@ -79,11 +79,11 @@ digraph remapping_lexer { S1 -> T_BR9 [ label = "9"]; S2 -> T_TILDE_SLASH [ label ="/" ]; S3 -> S4 [ label = "_" ]; - S3 -> S9 [ label = "", color = crimson, fontcolor = crimson]; + S3 -> S10 [ label = "", color = crimson, fontcolor = crimson]; S4 -> S5 [ label = "n" ]; S5 -> T_NS [ label = "s"]; S5 -> S6 [ label = "o" ]; - S6 -> S9 [ label = "d" ]; + S6 -> S8 [ label = "d" ]; S5 -> S7 [ label = "a" ]; S7 -> S8 [ label = "m" ]; S8 -> T_NODE [ label = "e"];