BIND 10 #2372: define State class for MasterLexer, base part
BIND 10 Development
do-not-reply at isc.org
Fri Oct 19 06:36:43 UTC 2012
#2372: define State class for MasterLexer, base part
-------------------------------------+-------------------------------------
Reporter: | Owner: UnAssigned
jinmei | Status: new
Type: task | Milestone: New Tasks
Priority: | Resolution:
medium | Sensitive: 0
Component: | Sub-Project: DNS
libdns++ | Estimated Difficulty: 0
Keywords: | Total Hours: 0
Defect Severity: N/A |
Feature Depending on Ticket: |
loadzone-ng |
Add Hours to Ticket: 0 |
Internal?: 0 |
-------------------------------------+-------------------------------------
Description changed by jinmei:
Old description:
> Subtask of #2368. See #2371. This defines the state class
> of `MasterLexer`.
>
> It's essentially private to `MasterLexer`, but we want to test them
> directly, so define it as semi-public, in the master_lexer_internal
> namespace.
>
> For the state transition, first understand the overall logic flow
> of BIND 9's isc_lex_gettoken(). Attached drawing may also help.
>
> This is the base class of the state. We'll have the following
> derived classes.
>
> {{{#!cpp
> class master_lexer_internal::State {
> // correspond specific state and derived class.
> enum ID { Start, CRLF, String, QuotedString, Number, EatLine, Done };
>
> // Handle the current state, and return next state. 'Done' class
> // throws.
> virtual State* handle(MasterLexer& lexer) const = 0;
>
> // Return whether state transition is completed. By default false,
> // only 'Done' class returns true.
> virtual bool isCompleted() const { return (false); }
>
> // We use singleton instances. This returns pre-generated instance.
> static State* getInstance(ID id);
> };
> }}}
>
> In this ticket, we define the base class and Start, CRLF, EatLine, and
> Done classes. For details of the state transition, see
> isc_lex_gettoken(). Sample implementation of Start is like this:
>
> {{{#!cpp
> class MasterLexer::Start : public MasterLexerState {
> virtual void handle(MasterLexer& lexer) const {
> const int c = lexer.source->getNextChar();
> if (lexer.isCommentStart(lexer, c, this)) {
> return (State::getInstance(EAT_LINE));
> }
> if (c == EOF) {
> lexer.last_was_eol_ = false;
> return (State::getInstance(DONE));
> }
> if (c == '\r') {
> return (State::getInstance(CRLF));
> }
> if (isdigit(c)) {
> lexer.last_was_eol_ = false;
> return (State::getInstance(NUMBER));
> }
> // and so on
> }
> };
> }}}
New description:
Subtask of #2368. See #2371. This defines the state class
of `MasterLexer`. To test this, we'll probably need to introduce a
base class of `MasterLexer` or template (that way, this task is
mostly dependency free).
It's essentially private to `MasterLexer`, but we want to test them
directly, so define it as semi-public, in the master_lexer_internal
namespace.
For the state transition, first understand the overall logic flow
of BIND 9's isc_lex_gettoken(). Attached drawing may also help.
This is the base class of the state. We'll have the following
derived classes.
{{{#!cpp
class master_lexer_internal::State {
// correspond specific state and derived class.
enum ID { Start, CRLF, String, QuotedString, Number, EatLine, Done };
// Handle the current state, and return next state. 'Done' class
// throws.
virtual State* handle(MasterLexer& lexer) const = 0;
// Return whether state transition is completed. By default false,
// only 'Done' class returns true.
virtual bool isCompleted() const { return (false); }
// We use singleton instances. This returns pre-generated instance.
static State* getInstance(ID id);
};
}}}
In this ticket, we define the base class and Start, CRLF, EatLine, and
Done classes. For details of the state transition, see
isc_lex_gettoken(). Sample implementation of Start is like this:
{{{#!cpp
class MasterLexer::Start : public MasterLexerState {
virtual void handle(MasterLexer& lexer) const {
const int c = lexer.source->getNextChar();
if (lexer.isCommentStart(lexer, c, this)) {
return (State::getInstance(EAT_LINE));
}
if (c == EOF) {
lexer.last_was_eol_ = false;
return (State::getInstance(DONE));
}
if (c == '\r') {
return (State::getInstance(CRLF));
}
if (isdigit(c)) {
lexer.last_was_eol_ = false;
return (State::getInstance(NUMBER));
}
// and so on
}
};
}}}
--
--
Ticket URL: <http://bind10.isc.org/ticket/2372#comment:1>
BIND 10 Development <http://bind10.isc.org>
BIND 10 Development
More information about the bind10-tickets
mailing list