Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Kea
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
Operations
Operations
Incidents
Packages & Registries
Packages & Registries
Container Registry
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Sebastian Schrader
Kea
Commits
cd65466a
Commit
cd65466a
authored
Feb 01, 2017
by
Francis Dupont
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[5106] Converted to flex 2.6.2
parent
776a5dc9
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
126 additions
and
120 deletions
+126
-120
src/bin/dhcp4/dhcp4_lexer.ll
src/bin/dhcp4/dhcp4_lexer.ll
+46
-44
src/bin/dhcp6/dhcp6_lexer.ll
src/bin/dhcp6/dhcp6_lexer.ll
+46
-44
src/lib/eval/lexer.ll
src/lib/eval/lexer.ll
+34
-32
No files found.
src/bin/dhcp4/dhcp4_lexer.ll
View file @
cd65466a
...
...
@@ -14,10 +14,12 @@
#include
<
boost/lexical_cast
.
hpp
>
#include
<
exceptions/exceptions
.
h
>
//
Work
around
an
incompatibility
in
flex
(
at
least
versions
//
2.5
.
31
through
2.5
.
33
)
:
it
generates
code
that
does
//
not
conform
to
C89
.
See
Debian
bug
333231
//
<
http:
//bugs
.
debian
.
org/cgi-bin/bugreport
.
cgi?bug
=
333231
>.
/
*
Please
avoid
C++
style
comments
(
//
...
eol
)
as
they
break
flex
2.6
.
2
*
/
/
*
Work
around
an
incompatibility
in
flex
(
at
least
versions
2.5
.
31
through
2.5
.
33
)
:
it
generates
code
that
does
not
conform
to
C89
.
See
Debian
bug
333231
<
http:
//bugs
.
debian
.
org/cgi-bin/bugreport
.
cgi?bug
=
333231
>.
*
/
#
undef
yywrap
#
define
yywrap
()
1
...
...
@@ -30,7 +32,7 @@ unsigned int comment_start_line = 0;
}
;
/
/
To
avoid
the
call
to
exit
...
oops
!
/
*
To
avoid
the
call
to
exit
...
oops
!
*
/
#
define
YY_FATAL_ERROR
(
msg
)
isc:
:
dhcp:
:
Parser4Context:
:fatal
(
msg
)
%
}
...
...
@@ -83,20 +85,20 @@ ControlCharacter [\x00-\x1f]
ControlCharacterFill [^"
\\
]
|\\
{
JSONEscapeSequence
}
%
{
/
/
This
code
run
each
time
a
pattern
is
matched
.
It
updates
the
location
//
by
moving
it
ahead
by
yyleng
bytes
.
yyleng
specifies
the
length
of
the
//
currently
matched
token
.
/
*
This
code
run
each
time
a
pattern
is
matched
.
It
updates
the
location
by
moving
it
ahead
by
yyleng
bytes
.
yyleng
specifies
the
length
of
the
currently
matched
token
.
*
/
#
define
YY_USER_ACTION
driver
.
loc_
.
columns
(
yyleng
)
;
%
}
%%
%
{
/
/
This
part
of
the
code
is
copied
over
to
the
verbatim
to
the
top
//
of
the
generated
yylex
function
.
Explanation:
//
http:
//www
.
gnu
.
org/software/bison/manual/html_node/Multiple-start_002dsymbols
.
html
/
*
This
part
of
the
code
is
copied
over
to
the
verbatim
to
the
top
of
the
generated
yylex
function
.
Explanation:
http:
//www
.
gnu
.
org/software/bison/manual/html_node/Multiple-start_002dsymbols
.
html
*
/
/
/
Code
run
each
time
yylex
is
called
.
/
*
Code
run
each
time
yylex
is
called
.
*
/
driver
.
loc_
.
step
()
;
if
(
start_token_flag
)
{
...
...
@@ -145,9 +147,9 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
"<?"
BEGIN
(
DIR_ENTER
)
;
<
DIR_ENTER
>
"include"
BEGIN
(
DIR_INCLUDE
)
;
<
DIR_INCLUDE
>
\
"([^\"
\n
])
+\
" {
/
/ Include directive.
/
* Include directive. */
/
/ Extract the filename.
/
* Extract the filename. */
std::string tmp(yytext+1);
tmp.resize(tmp.size() - 1);
...
...
@@ -160,12 +162,12 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
<*>{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. */
driver.loc_.step();
}
<*>[\n]+ {
/
/ Newline found. Let's update the location and continue.
/
* Newline found. Let's update the location and continue. */
driver.loc_.lines(yyleng);
driver.loc_.step();
}
...
...
@@ -1225,9 +1227,9 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
{JSONString} {
/
/
A string has been matched. It contains the actual string and single quotes.
//
We need to get those quotes out of the way and just use its content, e.g.
// for 'foo' we should get foo
/
*
A string has been matched. It contains the actual string and single quotes.
We need to get those quotes out of the way and just use its content, e.g.
for 'foo' we should get foo */
std::string raw(yytext+1);
size_t len = raw.size() - 1;
raw.resize(len);
...
...
@@ -1238,12 +1240,12 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
char c = raw[pos];
switch (c) {
case '"
':
/
/
impossible
condition
/
*
impossible
condition
*
/
driver
.
error
(
driver
.
loc_
,
"Bad quote in \"" + raw + "
\
""
)
;
case
'\\':
++pos
;
if
(
pos
>=
len
)
{
/
/
impossible
condition
/
*
impossible
condition
*
/
driver
.
error
(
driver
.
loc_
,
"Overflow escape in \"" + raw + "
\
""
)
;
}
c
=
raw
[
pos
]
;
...
...
@@ -1269,10 +1271,10 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
decoded.push_back('\t');
break;
case 'u':
/
/ support only \u0000 to \u00ff
/
* support only \u0000 to \u00ff */
++pos;
if (pos + 4 > len) {
/
/ impossible condition
/
* impossible condition */
driver.error(driver.loc_,
"
Overflow
unicode
escape
in
\
""
+
raw
+
"\"");
}
...
...
@@ -1288,7 +1290,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
} else if ((c >= 'a') && (c <= 'f')) {
b = (c - 'a' + 10) << 4;
} else {
/
/ impossible condition
/
* impossible condition */
driver.error(driver.loc_, "
Not
hexadecimal
in
unicode
escape
in
\
""
+
raw
+
"\"");
}
pos++;
...
...
@@ -1300,19 +1302,19 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
} else if ((c >= 'a') && (c <= 'f')) {
b |= c - 'a' + 10;
} else {
/
/ impossible condition
/
* impossible condition */
driver.error(driver.loc_, "
Not
hexadecimal
in
unicode
escape
in
\
""
+
raw
+
"\"");
}
decoded.push_back(static_cast<char>(b & 0xff));
break;
default:
/
/ impossible condition
/
* impossible condition */
driver.error(driver.loc_, "
Bad
escape
in
\
""
+
raw
+
"\"");
}
break;
default:
if ((c >= 0) && (c < 0x20)) {
/
/ impossible condition
/
* impossible condition */
driver.error(driver.loc_, "
Invalid
control
in
\
""
+
raw
+
"\"");
}
decoded.push_back(c);
...
...
@@ -1323,17 +1325,17 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
}
\"
{
JSONStringCharacter
}*{
ControlCharacter
}{
ControlCharacterFill
}*
\
" {
/
/ Bad string with a forbidden control character inside
/
* Bad string with a forbidden control character inside */
driver.error(driver.loc_, "
Invalid
control
in
" + std::string(yytext));
}
\"
{
JSONStringCharacter
}*
\\
{
BadJSONEscapeSequence
}[
^\
x
00
-\
x
1
f
"]*\"
{
/
/
Bad
string
with
a
bad
escape
inside
/
*
Bad
string
with
a
bad
escape
inside
*
/
driver
.
error
(
driver
.
loc_
,
"Bad escape in "
+
std:
:string
(
yytext
))
;
}
\
"{JSONStringCharacter}*\\\"
{
/
/
Bad
string
with
an
open
escape
at
the
end
/
*
Bad
string
with
an
open
escape
at
the
end
*
/
driver
.
error
(
driver
.
loc_
,
"Overflow escape in "
+
std:
:string
(
yytext
))
;
}
...
...
@@ -1345,25 +1347,25 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
":"
{
return
isc:
:
dhcp:
:
Dhcp4Parser:
:make_COLON
(
driver
.
loc_
)
; }
{
int
}
{
/
/
An
integer
was
found
.
/
*
An
integer
was
found
.
*
/
std:
:string
tmp
(
yytext
)
;
int64_t
integer
=
0
;
try
{
/
/
In
substring
we
want
to
use
negative
values
(
e
.
g
.
-1
).
//
In
enterprise-id
we
need
to
use
values
up
to
0xffffffff
.
//
To
cover
both
of
those
use
cases
,
we
need
at
least
//
int64_t
.
/
*
In
substring
we
want
to
use
negative
values
(
e
.
g
.
-1
).
In
enterprise-id
we
need
to
use
values
up
to
0xffffffff
.
To
cover
both
of
those
use
cases
,
we
need
at
least
int64_t
.
*
/
integer
=
boost:
:lexical_cast
<
int64_t
>(
tmp
)
;
}
catch
(
const
boost:
:bad_lexical_cast
&
)
{
driver
.
error
(
driver
.
loc_
,
"Failed to convert "
+
tmp
+
" to an integer."
)
;
}
/
/
The
parser
needs
the
string
form
as
double
conversion
is
no
lossless
/
*
The
parser
needs
the
string
form
as
double
conversion
is
no
lossless
*
/
return
isc:
:
dhcp:
:
Dhcp4Parser:
:make_INTEGER
(
integer
,
driver
.
loc_
)
;
}
[
-+
]
?
[
0-9
]*
\
.
?
[
0-9
]*([
eE
][
-+
]
?
[
0-9
]
+
)
?
{
/
/
A
floating
point
was
found
.
/
*
A
floating
point
was
found
.
*
/
std:
:string
tmp
(
yytext
)
;
double
fp
=
0.0
;
try
{
...
...
@@ -1430,10 +1432,10 @@ Parser4Context::scanStringBegin(const std::string& str, ParserType parser_type)
loc_
.
initialize
(
&file_
)
;
yy_flex_debug
=
trace_scanning_
;
YY_BUFFER_STATE
buffer
;
buffer
=
yy
_scan_bytes
(
str
.
c_str
(),
str
.
size
())
;
buffer
=
parser4_
_scan_bytes
(
str
.
c_str
(),
str
.
size
())
;
if
(
!buffer
)
{
fatal
(
"cannot scan string"
)
;
/
/
fatal
()
throws
an
exception
so
this
can't
be
reached
/
*
fatal
()
throws
an
exception
so
this
can't
be
reached
*
/
}
}
...
...
@@ -1451,7 +1453,7 @@ Parser4Context::scanFileBegin(FILE * f,
yy_flex_debug
=
trace_scanning_
;
YY_BUFFER_STATE
buffer
;
/
/
See
dhcp4_lexer
.
cc
header
for
available
definitions
/
*
See
dhcp4_lexer
.
cc
header
for
available
definitions
*
/
buffer
=
parser4__create_buffer
(
f
,
65536
/
*
buffer
size
*
/
)
;
if
(
!buffer
)
{
fatal
(
"cannot scan file "
+
filename
)
;
...
...
@@ -1465,7 +1467,7 @@ Parser4Context::scanEnd() {
fclose
(
sfile_
)
;
sfile_
=
0
;
static_cast
<
void
>(
parser4_lex_destroy
())
;
/
/
Close
files
/
*
Close
files
*
/
while
(
!sfiles_.empty
())
{
FILE
*
f
=
sfiles_
.
back
()
;
if
(
f
)
{
...
...
@@ -1473,7 +1475,7 @@ Parser4Context::scanEnd() {
}
sfiles_
.
pop_back
()
;
}
/
/
Delete
states
/
*
Delete
states
*
/
while
(
!states_.empty
())
{
parser4__delete_buffer
(
states_
.
back
())
;
states_
.
pop_back
()
;
...
...
@@ -1510,9 +1512,9 @@ Parser4Context::includeFile(const std::string& filename) {
}
namespace
{
/
//
To
avoid
unused
function
error
/
**
To
avoid
unused
function
error
*
/
class
Dummy
{
/
/
cppcheck-suppress
unusedPrivateFunction
/
*
cppcheck-suppress
unusedPrivateFunction
*
/
void
dummy
()
{
yy_fatal_error
(
"Fix me: how to disable its definition?"
)
; }
}
;
}
src/bin/dhcp6/dhcp6_lexer.ll
View file @
cd65466a
...
...
@@ -14,10 +14,12 @@
#include
<
boost/lexical_cast
.
hpp
>
#include
<
exceptions/exceptions
.
h
>
//
Work
around
an
incompatibility
in
flex
(
at
least
versions
//
2.5
.
31
through
2.5
.
33
)
:
it
generates
code
that
does
//
not
conform
to
C89
.
See
Debian
bug
333231
//
<
http:
//bugs
.
debian
.
org/cgi-bin/bugreport
.
cgi?bug
=
333231
>.
/
*
Please
avoid
C++
style
comments
(
//
...
eol
)
as
they
break
flex
2.6
.
2
*
/
/
*
Work
around
an
incompatibility
in
flex
(
at
least
versions
2.5
.
31
through
2.5
.
33
)
:
it
generates
code
that
does
not
conform
to
C89
.
See
Debian
bug
333231
<
http:
//bugs
.
debian
.
org/cgi-bin/bugreport
.
cgi?bug
=
333231
>.
*
/
#
undef
yywrap
#
define
yywrap
()
1
...
...
@@ -30,7 +32,7 @@ unsigned int comment_start_line = 0;
}
;
/
/
To
avoid
the
call
to
exit
...
oops
!
/
*
To
avoid
the
call
to
exit
...
oops
!
*
/
#
define
YY_FATAL_ERROR
(
msg
)
isc:
:
dhcp:
:
Parser6Context:
:fatal
(
msg
)
%
}
...
...
@@ -83,20 +85,20 @@ ControlCharacter [\x00-\x1f]
ControlCharacterFill [^"
\\
]
|\\
{
JSONEscapeSequence
}
%
{
/
/
This
code
run
each
time
a
pattern
is
matched
.
It
updates
the
location
//
by
moving
it
ahead
by
yyleng
bytes
.
yyleng
specifies
the
length
of
the
//
currently
matched
token
.
/
*
This
code
run
each
time
a
pattern
is
matched
.
It
updates
the
location
by
moving
it
ahead
by
yyleng
bytes
.
yyleng
specifies
the
length
of
the
currently
matched
token
.
*
/
#
define
YY_USER_ACTION
driver
.
loc_
.
columns
(
yyleng
)
;
%
}
%%
%
{
/
/
This
part
of
the
code
is
copied
over
to
the
verbatim
to
the
top
//
of
the
generated
yylex
function
.
Explanation:
//
http:
//www
.
gnu
.
org/software/bison/manual/html_node/Multiple-start_002dsymbols
.
html
/
*
This
part
of
the
code
is
copied
over
to
the
verbatim
to
the
top
of
the
generated
yylex
function
.
Explanation:
http:
//www
.
gnu
.
org/software/bison/manual/html_node/Multiple-start_002dsymbols
.
html
*
/
/
/
Code
run
each
time
yylex
is
called
.
/
*
Code
run
each
time
yylex
is
called
.
*
/
driver
.
loc_
.
step
()
;
if
(
start_token_flag
)
{
...
...
@@ -147,9 +149,9 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
"<?"
BEGIN
(
DIR_ENTER
)
;
<
DIR_ENTER
>
"include"
BEGIN
(
DIR_INCLUDE
)
;
<
DIR_INCLUDE
>
\
"([^\"
\n
])
+\
" {
/
/ Include directive.
/
* Include directive. */
/
/ Extract the filename.
/
* Extract the filename. */
std::string tmp(yytext+1);
tmp.resize(tmp.size() - 1);
...
...
@@ -162,12 +164,12 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
<*>{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. */
driver.loc_.step();
}
<*>[\n]+ {
/
/ Newline found. Let's update the location and continue.
/
* Newline found. Let's update the location and continue. */
driver.loc_.lines(yyleng);
driver.loc_.step();
}
...
...
@@ -1272,9 +1274,9 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
}
{JSONString} {
/
/
A string has been matched. It contains the actual string and single quotes.
//
We need to get those quotes out of the way and just use its content, e.g.
// for 'foo' we should get foo
/
*
A string has been matched. It contains the actual string and single quotes.
We need to get those quotes out of the way and just use its content, e.g.
for 'foo' we should get foo */
std::string raw(yytext+1);
size_t len = raw.size() - 1;
raw.resize(len);
...
...
@@ -1285,12 +1287,12 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
char c = raw[pos];
switch (c) {
case '"
':
/
/
impossible
condition
/
*
impossible
condition
*
/
driver
.
error
(
driver
.
loc_
,
"Bad quote in \"" + raw + "
\
""
)
;
case
'\\':
++pos
;
if
(
pos
>=
len
)
{
/
/
impossible
condition
/
*
impossible
condition
*
/
driver
.
error
(
driver
.
loc_
,
"Overflow escape in \"" + raw + "
\
""
)
;
}
c
=
raw
[
pos
]
;
...
...
@@ -1316,10 +1318,10 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
decoded.push_back('\t');
break;
case 'u':
/
/ support only \u0000 to \u00ff
/
* support only \u0000 to \u00ff */
++pos;
if (pos + 4 > len) {
/
/ impossible condition
/
* impossible condition */
driver.error(driver.loc_,
"
Overflow
unicode
escape
in
\
""
+
raw
+
"\"");
}
...
...
@@ -1335,7 +1337,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
} else if ((c >= 'a') && (c <= 'f')) {
b = (c - 'a' + 10) << 4;
} else {
/
/ impossible condition
/
* impossible condition */
driver.error(driver.loc_, "
Not
hexadecimal
in
unicode
escape
in
\
""
+
raw
+
"\"");
}
pos++;
...
...
@@ -1347,19 +1349,19 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
} else if ((c >= 'a') && (c <= 'f')) {
b |= c - 'a' + 10;
} else {
/
/ impossible condition
/
* impossible condition */
driver.error(driver.loc_, "
Not
hexadecimal
in
unicode
escape
in
\
""
+
raw
+
"\"");
}
decoded.push_back(static_cast<char>(b & 0xff));
break;
default:
/
/ impossible condition
/
* impossible condition */
driver.error(driver.loc_, "
Bad
escape
in
\
""
+
raw
+
"\"");
}
break;
default:
if ((c >= 0) && (c < 0x20)) {
/
/ impossible condition
/
* impossible condition */
driver.error(driver.loc_, "
Invalid
control
in
\
""
+
raw
+
"\"");
}
decoded.push_back(c);
...
...
@@ -1370,17 +1372,17 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
}
\"
{
JSONStringCharacter
}*{
ControlCharacter
}{
ControlCharacterFill
}*
\
" {
/
/ Bad string with a forbidden control character inside
/
* Bad string with a forbidden control character inside */
driver.error(driver.loc_, "
Invalid
control
in
" + std::string(yytext));
}
\"
{
JSONStringCharacter
}*
\\
{
BadJSONEscapeSequence
}[
^\
x
00
-\
x
1
f
"]*\"
{
/
/
Bad
string
with
a
bad
escape
inside
/
*
Bad
string
with
a
bad
escape
inside
*
/
driver
.
error
(
driver
.
loc_
,
"Bad escape in "
+
std:
:string
(
yytext
))
;
}
\
"{JSONStringCharacter}*\\\"
{
/
/
Bad
string
with
an
open
escape
at
the
end
/
*
Bad
string
with
an
open
escape
at
the
end
*
/
driver
.
error
(
driver
.
loc_
,
"Overflow escape in "
+
std:
:string
(
yytext
))
;
}
...
...
@@ -1392,25 +1394,25 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
":"
{
return
isc:
:
dhcp:
:
Dhcp6Parser:
:make_COLON
(
driver
.
loc_
)
; }
{
int
}
{
/
/
An
integer
was
found
.
/
*
An
integer
was
found
.
*
/
std:
:string
tmp
(
yytext
)
;
int64_t
integer
=
0
;
try
{
/
/
In
substring
we
want
to
use
negative
values
(
e
.
g
.
-1
).
//
In
enterprise-id
we
need
to
use
values
up
to
0xffffffff
.
//
To
cover
both
of
those
use
cases
,
we
need
at
least
//
int64_t
.
/
*
In
substring
we
want
to
use
negative
values
(
e
.
g
.
-1
).
In
enterprise-id
we
need
to
use
values
up
to
0xffffffff
.
To
cover
both
of
those
use
cases
,
we
need
at
least
int64_t
.
*
/
integer
=
boost:
:lexical_cast
<
int64_t
>(
tmp
)
;
}
catch
(
const
boost:
:bad_lexical_cast
&
)
{
driver
.
error
(
driver
.
loc_
,
"Failed to convert "
+
tmp
+
" to an integer."
)
;
}
/
/
The
parser
needs
the
string
form
as
double
conversion
is
no
lossless
/
*
The
parser
needs
the
string
form
as
double
conversion
is
no
lossless
*
/
return
isc:
:
dhcp:
:
Dhcp6Parser:
:make_INTEGER
(
integer
,
driver
.
loc_
)
;
}
[
-+
]
?
[
0-9
]*
\
.
?
[
0-9
]*([
eE
][
-+
]
?
[
0-9
]
+
)
?
{
/
/
A
floating
point
was
found
.
/
*
A
floating
point
was
found
.
*
/
std:
:string
tmp
(
yytext
)
;
double
fp
=
0.0
;
try
{
...
...
@@ -1477,10 +1479,10 @@ Parser6Context::scanStringBegin(const std::string& str, ParserType parser_type)
loc_
.
initialize
(
&file_
)
;
yy_flex_debug
=
trace_scanning_
;
YY_BUFFER_STATE
buffer
;
buffer
=
yy
_scan_bytes
(
str
.
c_str
(),
str
.
size
())
;
buffer
=
parser6_
_scan_bytes
(
str
.
c_str
(),
str
.
size
())
;
if
(
!buffer
)
{
fatal
(
"cannot scan string"
)
;
/
/
fatal
()
throws
an
exception
so
this
can't
be
reached
/
*
fatal
()
throws
an
exception
so
this
can't
be
reached
*
/
}
}
...
...
@@ -1498,7 +1500,7 @@ Parser6Context::scanFileBegin(FILE * f,
yy_flex_debug
=
trace_scanning_
;
YY_BUFFER_STATE
buffer
;
/
/
See
dhcp6_lexer
.
cc
header
for
available
definitions
/
*
See
dhcp6_lexer
.
cc
header
for
available
definitions
*
/
buffer
=
parser6__create_buffer
(
f
,
65536
/
*
buffer
size
*
/
)
;
if
(
!buffer
)
{
fatal
(
"cannot scan file "
+
filename
)
;
...
...
@@ -1512,7 +1514,7 @@ Parser6Context::scanEnd() {
fclose
(
sfile_
)
;
sfile_
=
0
;
static_cast
<
void
>(
parser6_lex_destroy
())
;
/
/
Close
files
/
*
Close
files
*
/
while
(
!sfiles_.empty
())
{
FILE
*
f
=
sfiles_
.
back
()
;
if
(
f
)
{
...
...
@@ -1520,7 +1522,7 @@ Parser6Context::scanEnd() {
}
sfiles_
.
pop_back
()
;
}
/
/
Delete
states
/
*
Delete
states
*
/
while
(
!states_.empty
())
{
parser6__delete_buffer
(
states_
.
back
())
;
states_
.
pop_back
()
;
...
...
@@ -1557,9 +1559,9 @@ Parser6Context::includeFile(const std::string& filename) {
}
namespace
{
/
//
To
avoid
unused
function
error
/
**
To
avoid
unused
function
error
*
/
class
Dummy
{
/
/
cppcheck-suppress
unusedPrivateFunction
/
*
cppcheck-suppress
unusedPrivateFunction
*
/
void
dummy
()
{
yy_fatal_error
(
"Fix me: how to disable its definition?"
)
; }
}
;
}
src/lib/eval/lexer.ll
View file @
cd65466a
...
...
@@ -14,18 +14,20 @@
#include
<
asiolink/io_address
.
h
>
#include
<
boost/lexical_cast
.
hpp
>
//
Work
around
an
incompatibility
in
flex
(
at
least
versions
//
2.5
.
31
through
2.5
.
33
)
:
it
generates
code
that
does
//
not
conform
to
C89
.
See
Debian
bug
333231
//
<
http:
//bugs
.
debian
.
org/cgi-bin/bugreport
.
cgi?bug
=
333231
>.
/
*
Please
avoid
C++
style
comments
(
//
...
eol
)
as
they
break
flex
2.6
.
2
*
/
/
*
Work
around
an
incompatibility
in
flex
(
at
least
versions
2.5
.
31
through
2.5
.
33
)
:
it
generates
code
that
does
not
conform
to
C89
.
See
Debian
bug
333231
<
http:
//bugs
.
debian
.
org/cgi-bin/bugreport
.
cgi?bug
=
333231
>.
*
/
#
undef
yywrap
#
define
yywrap
()
1
/
/
The
location
of
the
current
token
.
The
lexer
will
keep
updating
it
.
This
//
variable
will
be
useful
for
logging
errors
.
/
*
The
location
of
the
current
token
.
The
lexer
will
keep
updating
it
.
This
variable
will
be
useful
for
logging
errors
.
*
/
static
isc:
:
eval:
:location
loc
;
/
/
To
avoid
the
call
to
exit
...
oops
!
/
*
To
avoid
the
call
to
exit
...
oops
!
*
/
#
define
YY_FATAL_ERROR
(
msg
)
isc:
:
eval:
:
EvalContext:
:fatal
(
msg
)
%
}
...
...
@@ -66,34 +68,34 @@ addr4 [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+
addr6
[
0-9
a-fA-F
]*
\:
[
0-9
a-fA-F
]*
\:
[
0
-9a-fA-F:
.]*
%
{
/
/
This
code
run
each
time
a
pattern
is
matched
.
It
updates
the
location
//
by
moving
it
ahead
by
yyleng
bytes
.
yyleng
specifies
the
length
of
the
//
currently
matched
token
.
/
*
This
code
run
each
time
a
pattern
is
matched
.
It
updates
the
location
by
moving
it
ahead
by
yyleng
bytes
.
yyleng
specifies
the
length
of
the
currently
matched
token
.
*
/
#
define
YY_USER_ACTION
loc
.
columns
(
evalleng
)
;
%
}
%%
%
{
/
/
Code
run
each
time
evallex
is
called
.
/
*
Code
run
each
time
evallex
is
called
.
*
/
loc
.
step
()
;
%
}
{
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
()
;
}
[
\n
]
+
{
/
/
Newline
found
.
Let's
update
the
location
and
continue
.
/
*
Newline
found
.
Let's
update
the
location
and
continue
.
*
/
loc
.
lines
(
evalleng
)
;
loc
.
step
()
;
}
\'
[
^\'\n
]*
\'
{
/
/
A
string
has
been
matched
.
It
contains
the
actual
string
and
single
quotes
.
//
We
need
to
get
those
quotes
out
of
the
way
and
just
use
its
content
,
e
.
g
.
//
for
'foo'
we
should
get
foo
/
*
A
string
has
been
matched
.
It
contains
the
actual
string
and
single
quotes
.
We
need
to
get
those
quotes
out
of
the
way
and
just
use
its
content
,
e
.
g
.
for
'foo'
we
should
get
foo
*
/
std:
:string
tmp
(
evaltext+
1
)
;
tmp
.
resize
(
tmp
.
size
()
-
1
)
;
...
...
@@ -101,41 +103,41 @@ addr6 [0-9a-fA-F]*\:[0-9a-fA-F]*\:[0-9a-fA-F:.]*
}
0
[x
X
]{
hex
}
{
/
/
A
hex
string
has
been
matched
.
It
contains
the
'
0
x
'
or
'
0
X'
header
//
followed
by
at
least
one
hexadecimal
digit
.
/
*
A
hex
string
has
been
matched
.
It
contains
the
'
0
x
'
or
'
0
X'
header
followed
by
at
least
one
hexadecimal
digit
.
*
/
return
isc:
:
eval:
:
EvalParser:
:make_HEXSTRING
(
evaltext
,
loc
)
;
}
{
int
}
{
/
/
An
integer
was
found
.
/
*
An
integer
was
found
.
*
/
std:
:string
tmp
(
evaltext
)
;
try
{
/
/
In
substring
we
want
to
use
negative
values
(
e
.
g
.
-1
).
//
In
enterprise-id
we
need
to
use
values
up
to
0xffffffff
.
//
To
cover
both
of
those
use
cases
,
we
need
at
least
//
int64_t
.
/
*
In
substring
we
want
to
use
negative
values
(
e
.
g
.
-1
).
In
enterprise-id
we
need
to
use
values
up
to
0xffffffff
.
To
cover
both
of
those
use
cases
,
we
need
at
least
int64_t
.
*
/
static_cast
<
void
>(
boost:
:lexical_cast
<
int64_t
>(
tmp
))
;
}
catch
(
const
boost:
:bad_lexical_cast
&
)
{
driver
.
error
(
loc
,
"Failed to convert "
+
tmp
+
" to an integer."
)
;
}
/
/
The
parser
needs
the
string
form
as
double
conversion
is
no
lossless
/
*
The
parser
needs
the
string
form
as
double
conversion
is
no
lossless
*
/
return
isc:
:
eval:
:
EvalParser:
:make_INTEGER
(
tmp
,
loc
)
;
}
[
A-Za-z
]([
-_A-Za-z0
-9
]*[
A-Za-z0
-9
])
?/
({
blank
}
|\n
)*]
{