Calculator
Step 5
|
#include <parse.hpp>
Public Types | |
enum | kind : int { eof, identifier, number, string, plus ='+', minus ='-', times ='*', slash ='/', lparen = '(', rparen =')', equal ='=', comma =',' } |
Public Member Functions | |
parser (std::istream &input) | |
bool | get_statement (std::ostream &output) |
Private Member Functions | |
std::string | charify (char c) |
bool | get_number (std::string const &token, node &result) |
bool | get_expr (node &result) |
bool | get_add_expr (node &result) |
bool | get_mul_expr (node &result) |
bool | get_primary (node &result) |
bool | get_unary (node &result) |
void | get_definition (std::string &name, identifier_list ¶meters, node &definition) |
kind | get_token (std::string &token) |
void | get_identifier (std::string &identifier) |
void | get_expr_list (node_list &result) |
template<class OutputIterator > | |
OutputIterator | get_namelist (OutputIterator output) |
void | get_escape (std::string &str) |
void | get_string (std::string &result, char delimiter) |
void | push_back (std::string const &token, kind k) |
bool | isalpha (char c) const |
bool | isalnum (char c) const |
bool | isdigit (char c) const |
bool | isprint (char c) const |
Private Attributes | |
std::istream & | input_ |
Share the input stream. More... | |
std::ctype< char > const & | ctype_ |
Cache the ctype facet for checking character categories. More... | |
std::string | token_ |
One token push-back. More... | |
kind | kind_ |
The kind of token that was pushed back. More... | |
Parser class template. The parser reads tokens from an input stream. A token can be a keyword, numeric literal, identifier, or symbol (operator or punctuator). Symbols can have multiple characters (e.g., :=).
Because the recursive-descent parser can examine too many tokens from the input stream, it keeps a push-back token. Once the parser knows it has gone too far, it pushes back the most recently read token. The next call to get_token() retrieves the pushed-back token.
Only one push-back is available, which limits the complexity of the syntax.
enum parser::kind : int |
Token kind. Declare a name for each single-character token, to ensure the enumerated type can represent any operator or punctuator character.
Enumerator | |
---|---|
eof | |
identifier | |
number | |
string | |
plus | |
minus | |
times | |
slash | |
lparen | |
rparen | |
equal | |
comma |
Definition at line 31 of file parse.hpp.
parser::parser | ( | std::istream & | input | ) |
Constructor. Save the input
stream.
input | The input stream |
Definition at line 10 of file parse.cpp.
|
private |
Convert a characer to a readable form.
c | The character |
c
is readable. Definition at line 17 of file parse.cpp.
References isprint().
Referenced by get_identifier(), and get_token().
|
private |
Parse an addition expression
ADD_EXPR ::= MUL_EXPR | ADD_EXPR + MUL_EXPR | ADD_EXPR - MUL_EXPR
result | Store the result here |
Definition at line 296 of file parse.cpp.
References get_mul_expr(), get_token(), and push_back().
Referenced by get_expr().
|
private |
Parse a function or variable definition A variable is just like a function that takes no parameters.
DEFINITION ::= DEF IDENTIFIER OPT_PARAMETERS '=' EXPR OPT_PARAMETERS ::= emtpy | '(' OPT_IDENTIFIER_LIST ')' OPT_IDENTIFIER_LIST ::= empty | IDENTIFIER_LIST IDENTIFIER_LIST ::= IDENTIFIER | IDENTIFIER_LIST ',' IDENTIFIER
[out] | name | Store the variable or function name here |
[out] | parameters | Store the list of parameter names here |
[out] | definition | Store the definition expression here |
Definition at line 225 of file parse.cpp.
References get_expr(), get_namelist(), get_token(), and identifier.
Referenced by get_statement().
|
private |
Interpret a backslash escape sequence. The caller must have read the backslash already.
[out] | str | Write the string equivalent of the escape sequence at the end of this string |
Definition at line 41 of file parse.cpp.
References ctype_, and input_.
Referenced by get_string().
|
private |
Parse an expression
result | Store the result here |
Definition at line 291 of file parse.cpp.
References get_add_expr().
Referenced by get_definition(), get_expr_list(), get_primary(), and get_statement().
|
private |
Parse a comma-separated expression list.
[out] | result | Store the result here |
Definition at line 355 of file parse.cpp.
References get_expr(), get_token(), and push_back().
Referenced by get_primary().
|
private |
Parse an identifer.
identifier | Store the identifier here. |
Definition at line 102 of file parse.cpp.
References charify(), input_, isalnum(), and isalpha().
Referenced by get_token().
|
private |
Parse a multiplicative expression.
MUL_EXPR ::= UNARY | MUL_EXPR + UNARY | MUL_EXPR - UNARY
result | Store the result here |
Definition at line 315 of file parse.cpp.
References get_token(), get_unary(), and push_back().
Referenced by get_add_expr().
|
private |
Parse a list of parameter names. Names are identifiers, separated by commas. The list can be empty. This is a template so the container type is unimportant. Any output iterator will do.
[out] | output | Store the identifiers here |
output
after storing all the identifiers Definition at line 207 of file parse.hpp.
References get_token(), and identifier.
Referenced by get_definition().
|
private |
Parse a floating number.
token | The token to parse |
result | Store the number here |
token
is a valid number or false for an error Definition at line 214 of file parse.cpp.
Referenced by get_primary().
|
private |
Parse a primary expression.
PRIMARY ::= NUMBER | IDENTIFIER | '(' EXPR ')' | FUNCTION_CALL FUNCTION_CALL ::= IDENTIFIER '(' OPT_EXPR_LIST ')' OPT_EXPR_LIST ::= empty | EXPR_LIST EXPR_LIST ::= EXPR | EXPR_LIST ',' EXPR
result | Store the result here |
Definition at line 376 of file parse.cpp.
References eof, get_expr(), get_expr_list(), get_number(), get_token(), identifier, number, and push_back().
Referenced by get_unary().
bool parser::get_statement | ( | std::ostream & | output | ) |
Read one statement and store the parse tree in result
. If the statement is an assignment or function definition, store the variable or function. If the statement is an expression, print the result to output
.
STATEMENT ::= DEFINITION | QUIT | EXPR | SAVE | LOAD SAVE ::= "save" FILENAME LOAD ::= "load" FILENAME FILENAME ::= quoted-string
output | The output stream. |
parse_error | for various syntax and other errors |
Definition at line 246 of file parse.cpp.
References eof, node::evaluate(), get_definition(), get_expr(), get_token(), identifier, load_library(), push_back(), save_library(), and set_function().
Referenced by parse_loop().
|
private |
Parse a quoted string. The caller passes the quote character in the delimiter
argument.
[out] | result | Store the token here. |
[in] | delimiter | The quote character (' or " ) |
Definition at line 86 of file parse.cpp.
References get_escape(), and input_.
Referenced by get_token().
|
private |
Parse a token. A token can be a keyword, a literal or a symbol.
TOKEN ::= IDENTIFIER | NUMBER | SYMBOL | STRING IDENTIIFER ::= ALPHA (ALPHA | DIGIT)* NUMBER ::= DIGIT+ ('.' DIGITS+)? ('E' SIGN? DIGITS+)? SYMBOL ::= '+' | '-' | '*' | '/' | '%' | '(' | ')' | '=' | ','
token | Store the text of the token here. |
Definition at line 130 of file parse.cpp.
References charify(), eof, get_identifier(), get_string(), identifier, input_, isalpha(), kind_, number, string, and token_.
Referenced by get_add_expr(), get_definition(), get_expr_list(), get_mul_expr(), get_namelist(), get_primary(), get_statement(), and get_unary().
|
private |
Parse a unary expression.
UNARY ::= '-' PRIMARY | '+' PRIMARY | PRIMARY
result | Store the result here |
Definition at line 334 of file parse.cpp.
References eof, get_primary(), get_token(), and push_back().
Referenced by get_mul_expr().
|
inlineprivate |
Return true if c
is alphanumeric. Use the locale of the input stream.
c | The character to test. |
Definition at line 181 of file parse.hpp.
References ctype_.
Referenced by get_identifier().
|
inlineprivate |
Return true if c
is alphabetic. Use the locale of the input stream.
c | The character to test. |
Definition at line 176 of file parse.hpp.
References ctype_.
Referenced by get_identifier(), and get_token().
|
inlineprivate |
Return true if c
is a digit. Use the locale of the input stream.
c | The character to test. |
Definition at line 186 of file parse.hpp.
References ctype_.
|
inlineprivate |
Return true if c
is printable. Use the locale of the input stream.
c | The character to test. |
Definition at line 191 of file parse.hpp.
References ctype_.
Referenced by charify().
|
private |
Push back a token. The next call to get_token() will return the pushed-back token.
token | The token to push back. |
k | The kind of token being pushed back |
Definition at line 121 of file parse.cpp.
References eof, kind_, and token_.
Referenced by get_add_expr(), get_expr_list(), get_mul_expr(), get_primary(), get_statement(), and get_unary().
|
private |
|
private |
Share the input stream.
Definition at line 193 of file parse.hpp.
Referenced by get_escape(), get_identifier(), get_string(), and get_token().
|
private |
The kind of token that was pushed back.
Definition at line 196 of file parse.hpp.
Referenced by get_token(), and push_back().
|
private |
One token push-back.
Definition at line 195 of file parse.hpp.
Referenced by get_token(), and push_back().