|
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().
1.8.5