Commit 7df89021 authored by Tomek Mrugalski's avatar Tomek Mrugalski 🛰
Browse files

[5014] Implemented comments

 - addresses tickets #3450 (part about comments), #3960
parent 32a96adb
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include <dhcp6/parser_context.h> #include <dhcp6/parser_context.h>
#include <asiolink/io_address.h> #include <asiolink/io_address.h>
#include <boost/lexical_cast.hpp> #include <boost/lexical_cast.hpp>
#include <exceptions/exceptions.h>
// Work around an incompatibility in flex (at least versions // Work around an incompatibility in flex (at least versions
// 2.5.31 through 2.5.33): it generates code that does // 2.5.31 through 2.5.33): it generates code that does
...@@ -55,6 +56,8 @@ static isc::dhcp::location loc; ...@@ -55,6 +56,8 @@ static isc::dhcp::location loc;
useful in more complex cases. */ useful in more complex cases. */
%option yylineno %option yylineno
%x COMMENT
/* These are not token expressions yet, just convenience expressions that /* These are not token expressions yet, just convenience expressions that
can be used during actual token definitions. Note some can match can be used during actual token definitions. Note some can match
incorrect inputs (e.g., IP addresses) which must be checked. */ incorrect inputs (e.g., IP addresses) which must be checked. */
...@@ -80,8 +83,25 @@ JSONString \"{JSONStringCharacter}*\" ...@@ -80,8 +83,25 @@ JSONString \"{JSONStringCharacter}*\"
%{ %{
// Code run each time yylex is called. // Code run each time yylex is called.
loc.step(); loc.step();
int comment_start_line = 0;
%} %}
#.* ;
"//"(.*) ;
"/*" {
BEGIN(COMMENT);
comment_start_line = yylineno;
}
<COMMENT>"*/" BEGIN(INITIAL);
<COMMENT>.|"\n" ;
<COMMENT><<EOF>> {
isc_throw(isc::BadValue, "Comment not closed. (/* in line " << comment_start_line);
}
{blank}+ { {blank}+ {
// Ok, we found a with space. Let's ignore it and update loc variable. // Ok, we found a with space. Let's ignore it and update loc variable.
loc.step(); loc.step();
......
...@@ -14,6 +14,8 @@ using namespace std; ...@@ -14,6 +14,8 @@ using namespace std;
namespace { namespace {
void compareJSON(ConstElementPtr a, ConstElementPtr b) { void compareJSON(ConstElementPtr a, ConstElementPtr b) {
ASSERT_TRUE(a);
ASSERT_TRUE(b);
std::cout << a->str() << std::endl; std::cout << a->str() << std::endl;
std::cout << b->str() << std::endl; std::cout << b->str() << std::endl;
EXPECT_EQ(a->str(), b->str()); EXPECT_EQ(a->str(), b->str());
...@@ -33,6 +35,20 @@ void testParser(const std::string& txt) { ...@@ -33,6 +35,20 @@ void testParser(const std::string& txt) {
compareJSON(reference_json, test_json); compareJSON(reference_json, test_json);
} }
void testParser2(const std::string& txt) {
ConstElementPtr test_json;
EXPECT_NO_THROW({
Parser6Context ctx;
test_json = ctx.parseString(txt);
});
/// @todo: Implement actual validation here. since the original
/// Element::fromJSON does not support several comment types, we don't
/// have anything to compare with.
std::cout << "Original text:" << txt << endl;
std::cout << "Parsed text :" << test_json->str() << endl;
}
TEST(ParserTest, mapInMap) { TEST(ParserTest, mapInMap) {
string txt = "{ \"Dhcp6\": { \"foo\": 123, \"baz\": 456 } }"; string txt = "{ \"Dhcp6\": { \"foo\": 123, \"baz\": 456 } }";
testParser(txt); testParser(txt);
...@@ -76,4 +92,76 @@ TEST(ParserTest, types) { ...@@ -76,4 +92,76 @@ TEST(ParserTest, types) {
testParser(txt); testParser(txt);
} }
TEST(ParserTest, bashComments) {
string txt= "{ \"interfaces-config\": {"
" \"interfaces\": [ \"*\" ]"
"},\n"
"\"preferred-lifetime\": 3000,\n"
"# this is a comment\n"
"\"rebind-timer\": 2000, \n"
"# lots of comments here\n"
"# and here\n"
"\"renew-timer\": 1000, \n"
"\"subnet6\": [ { "
" \"pools\": [ { \"pool\": \"2001:db8:1::/64\" } ],"
" \"subnet\": \"2001:db8:1::/48\", "
" \"interface-id\": \"\","
" \"interface\": \"eth0\""
" } ],"
"\"valid-lifetime\": 4000 }";
testParser(txt);
}
TEST(ParserTest, cComments) {
string txt= "{ \"interfaces-config\": {"
" \"interfaces\": [ \"*\" ]"
"},\n"
"\"preferred-lifetime\": 3000, // this is a comment \n"
"\"rebind-timer\": 2000, // everything after // is ignored\n"
"\"renew-timer\": 1000, // this will be ignored, too\n"
"\"subnet6\": [ { "
" \"pools\": [ { \"pool\": \"2001:db8:1::/64\" } ],"
" \"subnet\": \"2001:db8:1::/48\", "
" \"interface-id\": \"\","
" \"interface\": \"eth0\""
" } ],"
"\"valid-lifetime\": 4000 }";
testParser2(txt);
}
TEST(ParserTest, bashComments2) {
string txt= "{ \"interfaces-config\": {"
" \"interfaces\": [ \"*\" ]"
"},\n"
"\"preferred-lifetime\": 3000, # this is a comment \n"
"\"rebind-timer\": 2000, # everything after # is ignored\n"
"\"renew-timer\": 1000, # this will be ignored, too\n"
"\"subnet6\": [ { "
" \"pools\": [ { \"pool\": \"2001:db8:1::/64\" } ],"
" \"subnet\": \"2001:db8:1::/48\", "
" \"interface-id\": \"\","
" \"interface\": \"eth0\""
" } ],"
"\"valid-lifetime\": 4000 }";
testParser2(txt);
}
TEST(ParserTest, multilineComments) {
string txt= "{ \"interfaces-config\": {"
" \"interfaces\": [ \"*\" ]"
"},\n"
"\"preferred-lifetime\": 3000, /* this is a C style comment\n"
"that\n can \n span \n multiple \n lines */ \n"
"\"rebind-timer\": 2000,\n"
"\"renew-timer\": 1000, \n"
"\"subnet6\": [ { "
" \"pools\": [ { \"pool\": \"2001:db8:1::/64\" } ],"
" \"subnet\": \"2001:db8:1::/48\", "
" \"interface-id\": \"\","
" \"interface\": \"eth0\""
" } ],"
"\"valid-lifetime\": 4000 }";
testParser2(txt);
}
}; };
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment