1
0
mirror of https://gitlab.com/rnger/amath synced 2025-10-06 02:49:59 +00:00
Files
amath/doc/man/man3/Parser.3
2017-01-24 22:03:15 +01:00

1028 lines
31 KiB
Groff

.TH "Parser" 3 "Tue Jan 24 2017" "Version 1.6.2" "amath" \" -*- nroff -*-
.ad l
.nh
.SH NAME
Parser \- Encapsulates a recursive descent parser\&.
.SH SYNOPSIS
.br
.PP
.PP
\fC#include <parser\&.h>\fP
.SS "Public Member Functions"
.in +1c
.ti -1c
.RI "\fBParser\fP (const char *input)"
.br
.ti -1c
.RI "\fB~Parser\fP ()"
.br
.ti -1c
.RI "\fBSyntaxNode\fP * \fBParse\fP ()"
.br
.RI "\fIParses the input into a syntax tree\&. \fP"
.in -1c
.SS "Private Member Functions"
.in +1c
.ti -1c
.RI "\fBSyntaxNode\fP * \fBParseDefault\fP ()"
.br
.ti -1c
.RI "\fBSyntaxNode\fP * \fBTryParseStatement\fP ()"
.br
.ti -1c
.RI "\fBSyntaxNode\fP * \fBParseStatement\fP ()"
.br
.ti -1c
.RI "\fBSyntaxNode\fP * \fBParseEvaluation\fP ()"
.br
.ti -1c
.RI "\fBExpressionNode\fP * \fBParseExpression\fP ()"
.br
.ti -1c
.RI "\fBExpressionNode\fP * \fBParseAddSubstract\fP ()"
.br
.ti -1c
.RI "\fBExpressionNode\fP * \fBParseFactor\fP ()"
.br
.ti -1c
.RI "\fBExpressionNode\fP * \fBParsePower\fP ()"
.br
.ti -1c
.RI "\fBExpressionNode\fP * \fBParseUnary\fP ()"
.br
.ti -1c
.RI "\fBExpressionNode\fP * \fBParseAtomic\fP ()"
.br
.ti -1c
.RI "\fBExpressionNode\fP * \fBParseIdent\fP ()"
.br
.ti -1c
.RI "\fBExpressionNode\fP * \fBParseNumber\fP ()"
.br
.ti -1c
.RI "\fBSyntaxNode\fP * \fBParseFunctionDef\fP ()"
.br
.ti -1c
.RI "\fBSyntaxNode\fP * \fBParseHelpStatement\fP ()"
.br
.ti -1c
.RI "\fBSyntaxNode\fP * \fBParseDeleteStatement\fP ()"
.br
.ti -1c
.RI "\fBSyntaxNode\fP * \fBParseListStatement\fP ()"
.br
.ti -1c
.RI "\fBSyntaxNode\fP * \fBParseFileStatement\fP ()"
.br
.ti -1c
.RI "\fBSyntaxNode\fP * \fBParseNumeralStatement\fP ()"
.br
.ti -1c
.RI "\fBSyntaxNode\fP * \fBParseDigistStatement\fP ()"
.br
.ti -1c
.RI "\fBSyntaxNode\fP * \fBParseDrawStatement\fP ()"
.br
.ti -1c
.RI "\fBSyntaxNode\fP * \fBParsePromptStatement\fP ()"
.br
.ti -1c
.RI "\fBSyntaxNode\fP * \fBParsePrefsStatement\fP ()"
.br
.ti -1c
.RI "void \fBGetToken\fP ()"
.br
.ti -1c
.RI "void \fBPutToken\fP ()"
.br
.ti -1c
.RI "\fBbool\fP \fBExpect\fP (\fBSymbol\fP symbol)"
.br
.in -1c
.SS "Private Attributes"
.in +1c
.ti -1c
.RI "\fBLexer\fP * \fBlexer\fP"
.br
.ti -1c
.RI "\fBToken\fP * \fBtoken\fP"
.br
.ti -1c
.RI "int \fBsyntaxError\fP"
.br
.ti -1c
.RI "\fBErrorNode\fP * \fBerrorNode\fP"
.br
.in -1c
.SH "Detailed Description"
.PP
Encapsulates a recursive descent parser\&.
More info on recursive descent parsers is available at Wikipedia: http://en.wikipedia.org/wiki/Recursive_descent_parser
.PP
Definition at line 49 of file parser\&.h\&.
.SH "Constructor & Destructor Documentation"
.PP
.SS "Parser::Parser (const char * input)"
.PP
Definition at line 39 of file parser\&.cpp\&.
.PP
References Lexer::Lexer(), and lexer\&.
.PP
Referenced by Evaluator::Evaluate(), LoadStatement::Execute(), ExecuteStatement::Execute(), and PreferencesBase::SetPrefs()\&.
.PP
.nf
40 {
41 lexer = new Lexer(input);
42 }
.fi
.SS "Parser::~Parser ()"
.PP
Definition at line 44 of file parser\&.cpp\&.
.PP
References lexer\&.
.PP
.nf
45 {
46 delete lexer;
47 }
.fi
.SH "Member Function Documentation"
.PP
.SS "\fBbool\fP Parser::Expect (\fBSymbol\fP symbol)\fC [private]\fP"
.PP
Definition at line 411 of file parser\&.cpp\&.
.PP
References Token::GetPos(), GetToken(), Token::symbol, syntaxError, and token\&.
.PP
Referenced by ParseAtomic(), ParseDefault(), ParseDeleteStatement(), ParseDrawStatement(), ParseFileStatement(), ParseFunctionDef(), and ParseIdent()\&.
.PP
.nf
412 {
413 GetToken();
414 if (token->symbol != symbol) {
415 syntaxError = token->GetPos();
416 return false;
417 } else {
418 return true;
419 }
420 }
.fi
.SS "void Parser::GetToken ()\fC [private]\fP"
.PP
Definition at line 401 of file parser\&.cpp\&.
.PP
References Lexer::GetFirstToken(), Token::GetNextToken(), lexer, and token\&.
.PP
Referenced by Expect(), Parse(), ParseAddSubstract(), ParseAtomic(), ParseDeleteStatement(), ParseDigistStatement(), ParseFactor(), ParseHelpStatement(), ParseIdent(), ParseListStatement(), ParseNumber(), ParseNumeralStatement(), ParsePower(), ParsePrefsStatement(), ParsePromptStatement(), ParseStatement(), ParseUnary(), and TryParseStatement()\&.
.PP
.nf
402 {
403 token = (token == NOMEM ? lexer->GetFirstToken() : token->GetNextToken());
404 }
.fi
.SS "\fBSyntaxNode\fP * Parser::Parse ()"
.PP
Parses the input into a syntax tree\&.
.PP
\fBReturns:\fP
.RS 4
SyntaxNode* representing a pointer to the top node of the tree\&. Notice: The caller is responsible for releasing memory\&.
.RE
.PP
.PP
Definition at line 49 of file parser\&.cpp\&.
.PP
References StatementBlockNode::Add(), EmptyStatement::EmptyStatement(), ErrorNode::ErrorNode(), Lexer::GetInput(), Token::GetPos(), GetToken(), lexer, PutToken(), StatementBlockNode::StatementBlockNode(), Token::symbol, symdelimiter, symend, token, Lexer::Tokenize(), and TryParseStatement()\&.
.PP
Referenced by Evaluator::Evaluate(), LoadStatement::Execute(), ExecuteStatement::Execute(), and PreferencesBase::SetPrefs()\&.
.PP
.nf
50 {
51 lexer->Tokenize();
52 token = NOMEM;
53
54 StatementBlockNode *block = NOMEM;
55 SyntaxNode *result;
56 Token *current;
57
58 do {
59 result = TryParseStatement();
60
61 GetToken();
62 if (token->symbol == symdelimiter || (token->symbol == symend && block != NOMEM)) {
63 if (block == NOMEM) {
64 block = new StatementBlockNode();
65 }
66
67 if (result != NOMEM) {
68 block->Add(result);
69 }
70
71 while (token->symbol == symdelimiter) {
72 GetToken();
73 }
74 } else if (token->symbol != symend) {
75 if (result != NOMEM) {
76 delete result;
77 }
78
79 result = new ErrorNode(lexer->GetInput(), token->GetPos());
80 if (block != NOMEM) {
81 block->Add(result);
82 }
83
84 GetToken();
85 }
86
87 current = token;
88 PutToken();
89 } while (current->symbol != symend);
90
91 return block != NOMEM ? block :
92 result != NOMEM ? result : new EmptyStatement();;
93 }
.fi
.SS "\fBExpressionNode\fP * Parser::ParseAddSubstract ()\fC [private]\fP"
.PP
Definition at line 237 of file parser\&.cpp\&.
.PP
References AdditionNode::AdditionNode(), GetToken(), ParseFactor(), PutToken(), SubtractionNode::SubtractionNode(), Token::symbol, symminus, symplus, and token\&.
.PP
Referenced by ParseExpression()\&.
.PP
.nf
238 {
239 ExpressionNode* node = ParseFactor ();
240
241 GetToken();
242 while (token->symbol == symplus || token->symbol == symminus) {
243 if (token->symbol == symplus) {
244 node = new AdditionNode (node, ParseFactor ());
245 } else if (token->symbol == symminus) {
246 node = new SubtractionNode (node, ParseFactor ());
247 }
248
249 GetToken();
250 }
251
252 PutToken();
253 return node;
254 }
.fi
.SS "\fBExpressionNode\fP * Parser::ParseAtomic ()\fC [private]\fP"
.PP
Definition at line 304 of file parser\&.cpp\&.
.PP
References AbsoluteNode::AbsoluteNode(), ComplexiNode::ComplexiNode(), EulersNumberNode::EulersNumberNode(), Expect(), Token::GetPos(), GetToken(), InsVariableNode::InsVariableNode(), NumericValueNode::NumericValueNode(), ParseExpression(), ParseIdent(), ParseNumber(), PiNode::PiNode(), symabsolute, Token::symbol, syme, symi, symident, symins, symlparen, symnumber, sympi, symrparen, syntaxError, and token\&.
.PP
Referenced by ParseUnary()\&.
.PP
.nf
305 {
306 ExpressionNode* node;
307
308 GetToken();
309 if (token->symbol == symlparen) {
310 node = ParseExpression();
311 Expect(symrparen);
312 } else if (token->symbol == symabsolute) {
313 node = new AbsoluteNode(ParseExpression());
314 Expect(symabsolute);
315 } else if (token->symbol == symident) {
316 node = ParseIdent();
317 } else if (token->symbol == sympi) {
318 node = new PiNode();
319 } else if (token->symbol == syme) {
320 node = new EulersNumberNode();
321 } else if (token->symbol == symi) {
322 node = new ComplexiNode();
323 } else if (token->symbol == symins) {
324 node = new InsVariableNode();
325 } else if (token->symbol == symnumber) {
326 node = ParseNumber();
327 } else {
328 node = new NumericValueNode();
329 syntaxError = token->GetPos();
330 }
331
332 return node;
333 }
.fi
.SS "\fBSyntaxNode\fP * Parser::ParseDefault ()\fC [private]\fP"
.PP
Definition at line 194 of file parser\&.cpp\&.
.PP
References errorNode, Expect(), ParseEvaluation(), ParseFunctionDef(), symassign, symident, symlparen, symrparen, syntaxError, and token\&.
.PP
Referenced by ParseStatement()\&.
.PP
.nf
195 {
196 Token *temp = token;
197
198 // Peek tokens
199 bool funcdef = Expect(symident);
200 funcdef = funcdef && Expect(symlparen);
201 funcdef = funcdef && Expect(symident);
202 funcdef = funcdef && Expect(symrparen);
203 funcdef = funcdef && Expect(symassign);
204
205 // Restart parsing
206 syntaxError = -1;
207 errorNode = NOMEM;
208 token = temp;
209
210 if (funcdef) {
211 return ParseFunctionDef();
212 } else {
213 return ParseEvaluation();
214 }
215 }
.fi
.SS "\fBSyntaxNode\fP * Parser::ParseDeleteStatement ()\fC [private]\fP"
.PP
Definition at line 470 of file parser\&.cpp\&.
.PP
References DeleteStatement::DeleteStatement(), Expect(), Token::GetPos(), Token::GetText(), GetToken(), PutToken(), Token::symbol, symfunction, symident, symlparen, symrparen, symvariable, syntaxError, and token\&.
.PP
Referenced by ParseStatement()\&.
.PP
.nf
471 {
472 GetToken();
473 if (token->symbol == symvariable || token->symbol == symfunction) {
474 return new DeleteStatement(token->symbol);
475 } else if (token->symbol != symident) {
476 syntaxError = token->GetPos();
477 return NOMEM;
478 }
479
480 Token *identToken = token;
481
482 GetToken();
483 if (token->symbol == symlparen) {
484 Expect(symident);
485 Token *parameter = token;
486 Expect(symrparen);
487 return new DeleteStatement(identToken->GetText(), parameter->GetText());
488 } else {
489 PutToken();
490 return new DeleteStatement(token->GetText());
491 }
492 }
.fi
.SS "\fBSyntaxNode\fP * Parser::ParseDigistStatement ()\fC [private]\fP"
.PP
Definition at line 588 of file parser\&.cpp\&.
.PP
References DecimalSystem::DecimalSystem(), DigitsStatement::DigitsStatement(), errorNode, ErrorNode::ErrorNode(), Lexer::GetInput(), Number::GetIntegerValue(), Token::GetPos(), Token::GetText(), GetToken(), lexer, NumeralSystem::Parse(), PutToken(), Token::symbol, symdelimiter, symend, symnumber, syntaxError, and token\&.
.PP
Referenced by ParseStatement()\&.
.PP
.nf
589 {
590 GetToken();
591 if (token->symbol == symdelimiter || token->symbol == symend) {
592 PutToken();
593 return new DigitsStatement();
594 } else if (token->symbol != symnumber) {
595 syntaxError = token->GetPos();
596 return NOMEM;
597 }
598
599 NumeralSystem *nsys = new DecimalSystem(0);
600 Number *number = nsys->Parse(token->GetText());
601 int digits = number->GetIntegerValue();
602 delete number;
603 delete nsys;
604
605 if (digits < 0 || digits > 15) {
606 errorNode = new ErrorNode(
607 lexer->GetInput(),
608 HELPPDIGITS,
609 token->GetText(),
610 token->GetPos());
611
612 return NOMEM;
613 }
614
615 return new DigitsStatement(digits);
616 }
.fi
.SS "\fBSyntaxNode\fP * Parser::ParseDrawStatement ()\fC [private]\fP"
.PP
Definition at line 640 of file parser\&.cpp\&.
.PP
References DrawStatement::DrawStatement(), Expect(), Token::GetText(), PlotStatement::PlotStatement(), Token::symbol, symident, symlparen, symplot, symrparen, and token\&.
.PP
Referenced by ParseStatement()\&.
.PP
.nf
641 {
642 Token *statement = token;
643
644 Expect(symident);
645 Token *identToken = token;
646 Expect(symlparen);
647 Expect(symident);
648 Token *paramToken = token;
649 Expect(symrparen);
650
651 if (statement->symbol == symplot) {
652 return new PlotStatement(identToken->GetText(), paramToken->GetText());
653 } else {
654 return new DrawStatement(identToken->GetText(), paramToken->GetText());
655 }
656 }
.fi
.SS "\fBSyntaxNode\fP * Parser::ParseEvaluation ()\fC [private]\fP"
.PP
Definition at line 217 of file parser\&.cpp\&.
.PP
References EvalStatement::EvalStatement(), ExpressionNode::IsSilent(), ParseExpression(), and SilentStatement::SilentStatement()\&.
.PP
Referenced by ParseDefault()\&.
.PP
.nf
218 {
219 ExpressionNode *exp = ParseExpression();
220 if (exp == NOMEM) {
221 return NOMEM;
222 }
223
224 StatementNode *sta = new EvalStatement(exp);
225 if (exp->IsSilent()) {
226 sta = new SilentStatement(sta);
227 }
228
229 return sta;
230 }
.fi
.SS "\fBExpressionNode\fP * Parser::ParseExpression ()\fC [private]\fP"
.PP
Definition at line 232 of file parser\&.cpp\&.
.PP
References ParseAddSubstract()\&.
.PP
Referenced by ParseAtomic(), ParseEvaluation(), ParseFunctionDef(), ParseIdent(), and ParseStatement()\&.
.PP
.nf
233 {
234 return ParseAddSubstract();
235 }
.fi
.SS "\fBExpressionNode\fP * Parser::ParseFactor ()\fC [private]\fP"
.PP
Definition at line 256 of file parser\&.cpp\&.
.PP
References DivisionNode::DivisionNode(), GetToken(), MultiplicationNode::MultiplicationNode(), ParsePower(), PutToken(), Token::symbol, symslash, symtimes, and token\&.
.PP
Referenced by ParseAddSubstract()\&.
.PP
.nf
257 {
258 ExpressionNode* node = ParsePower ();
259
260 GetToken();
261 while (token->symbol == symtimes || token->symbol == symslash) {
262 if (token->symbol == symtimes) {
263 node = new MultiplicationNode (node, ParsePower ());
264 } else if (token->symbol == symslash) {
265 node = new DivisionNode (node, ParsePower ());
266 }
267
268 GetToken();
269 }
270
271 PutToken();
272 return node;
273 }
.fi
.SS "\fBSyntaxNode\fP * Parser::ParseFileStatement ()\fC [private]\fP"
.PP
Definition at line 508 of file parser\&.cpp\&.
.PP
References ErrorNode::ErrorNode(), ExecuteStatement::ExecuteStatement(), Expect(), Lexer::GetInput(), Token::GetPos(), Token::GetText(), lexer, LoadStatement::LoadStatement(), SaveStatement::SaveStatement(), ShowStatement::ShowStatement(), Token::symbol, symexecute, symload, symqident, symsave, symshow, and token\&.
.PP
Referenced by ParseStatement()\&.
.PP
.nf
509 {
510 Token *statement = token;
511
512 Expect(symqident);
513 Token *identToken = token;
514
515 if (statement->symbol == symload) {
516 return new LoadStatement(identToken->GetText());
517 } else if (statement->symbol == symsave) {
518 return new SaveStatement(identToken->GetText());
519 } else if (statement->symbol == symexecute) {
520 return new ExecuteStatement(identToken->GetText());
521 } else if (statement->symbol == symshow) {
522 return new ShowStatement(identToken->GetText());
523 } else {
524 return new ErrorNode(
525 lexer->GetInput(),
526 HELPUERROR, EMPTYSTRING,
527 statement->GetPos());
528 }
529 }
.fi
.SS "\fBSyntaxNode\fP * Parser::ParseFunctionDef ()\fC [private]\fP"
.PP
Definition at line 426 of file parser\&.cpp\&.
.PP
References UserFunction::CreateVariable(), errorNode, ErrorNode::ErrorNode(), Expect(), FunctionDefinitionNode::FunctionDefinitionNode(), Program::Functions, FunctionList::GetFunctionDef(), Lexer::GetInput(), Token::GetPos(), Token::GetText(), VariableList::InsertTemporaryVariable(), FunctionList::IsSystemFunction(), lexer, ParseExpression(), VariableList::RemoveTemporaryVariable(), UserFunction::SetExpression(), symassign, symident, symlparen, symrparen, token, and Program::Variables\&.
.PP
Referenced by ParseDefault(), and ParseStatement()\&.
.PP
.nf
427 {
428 Expect(symident);
429 Token* funcToken = token;
430 Expect(symlparen);
431 Expect(symident);
432 Token* funcVariable = token;
433 Expect(symrparen);
434 Expect(symassign);
435
436 if (Program->Functions->IsSystemFunction(funcToken->GetText())) {
437 errorNode = new ErrorNode(
438 lexer->GetInput(),
439 HELPFUNRDEF,
440 funcToken->GetText(),
441 funcToken->GetPos());
442
443 return NOMEM;
444 }
445
446 UserFunction* function = Program->Functions->GetFunctionDef(funcToken->GetText());
447 Variable* variable = function->CreateVariable(funcVariable->GetText());
448 Program->Variables->InsertTemporaryVariable(variable);
449 function->SetExpression(ParseExpression());
450 Program->Variables->RemoveTemporaryVariable();
451
452 // TODO: Move logic to FunctionDefinitionNode
453 return new FunctionDefinitionNode();
454 }
.fi
.SS "\fBSyntaxNode\fP * Parser::ParseHelpStatement ()\fC [private]\fP"
.PP
Definition at line 456 of file parser\&.cpp\&.
.PP
References Token::GetText(), GetToken(), HelpStatement::HelpStatement(), PutToken(), Token::symbol, symdelimiter, symend, symident, and token\&.
.PP
Referenced by ParseStatement()\&.
.PP
.nf
457 {
458 GetToken();
459
460 if (token->symbol == symdelimiter || token->symbol == symend) {
461 PutToken();
462 return new HelpStatement();
463 } else if (token->symbol == symident) {
464 return new HelpStatement(token->GetText());
465 } else {
466 return new HelpStatement(token->symbol);
467 }
468 }
.fi
.SS "\fBExpressionNode\fP * Parser::ParseIdent ()\fC [private]\fP"
.PP
Definition at line 335 of file parser\&.cpp\&.
.PP
References AssignmentNode::AssignmentNode(), VariableList::CreateVariable(), errorNode, ErrorNode::ErrorNode(), Expect(), Program::Functions, FunctionList::GetFunctionCall(), Lexer::GetInput(), Token::GetPos(), Token::GetText(), GetToken(), VariableList::GetVariable(), lexer, NumericValueNode::NumericValueNode(), ParseExpression(), PutToken(), symassign, Token::symbol, symlparen, symrparen, token, VariableNode::VariableNode(), and Program::Variables\&.
.PP
Referenced by ParseAtomic()\&.
.PP
.nf
336 {
337 ExpressionNode *node;
338 Token *identToken = token;
339
340 GetToken();
341 if (token->symbol == symlparen) {
342 ExpressionNode* parameter = ParseExpression();
343 Expect(symrparen);
344 node = Program->Functions->GetFunctionCall(identToken->GetText(), parameter);
345
346 if (node == NOMEM) {
347 errorNode = new ErrorNode(
348 lexer->GetInput(),
349 HELPFUNNDEF,
350 identToken->GetText(),
351 identToken->GetPos());
352
353 delete parameter;
354 node = new NumericValueNode();
355 }
356 } else if (token->symbol == symassign) {
357 Variable* var = Program->Variables->CreateVariable(identToken->GetText());
358 node = new AssignmentNode(new VariableNode(var), ParseExpression());
359 } else {
360 PutToken();
361 Variable* var = Program->Variables->GetVariable(token->GetText());
362
363 if (var == NOMEM) {
364 errorNode = new ErrorNode(
365 lexer->GetInput(),
366 HELPVARNDEF,
367 identToken->GetText(),
368 identToken->GetPos());
369
370 node = new NumericValueNode();
371 } else {
372 node = new VariableNode(var);
373 }
374 }
375
376 return node;
377 }
.fi
.SS "\fBSyntaxNode\fP * Parser::ParseListStatement ()\fC [private]\fP"
.PP
Definition at line 494 of file parser\&.cpp\&.
.PP
References Token::GetPos(), Token::GetText(), GetToken(), ListStatement::ListStatement(), PutToken(), Token::symbol, symdelimiter, symend, symqident, syntaxError, and token\&.
.PP
Referenced by ParseStatement()\&.
.PP
.nf
495 {
496 GetToken();
497 if (token->symbol == symqident)
498 return new ListStatement(token->GetText());
499 else if (token->symbol == symend || symdelimiter) {
500 PutToken();
501 return new ListStatement();
502 } else {
503 syntaxError = token->GetPos();
504 return NOMEM;
505 }
506 }
.fi
.SS "\fBExpressionNode\fP * Parser::ParseNumber ()\fC [private]\fP"
.PP
Definition at line 379 of file parser\&.cpp\&.
.PP
References ComplexNumber::ComplexNumber(), Number::GetRealValue(), Token::GetText(), GetToken(), Program::Input, NumericValueNode::NumericValueNode(), NumeralSystem::Parse(), PutToken(), Token::symbol, symi, and token\&.
.PP
Referenced by ParseAtomic()\&.
.PP
.nf
380 {
381 const char *a = token->GetText();
382 Number *number = NOMEM;
383
384 GetToken();
385 if (token->symbol == symi) {
386 Number *imag = Program->Input->Parse(a);
387 number = new ComplexNumber(0\&.0, imag->GetRealValue());
388 delete imag;
389 } else {
390 PutToken();
391 number = Program->Input->Parse(a);
392 }
393
394 return new NumericValueNode (number);
395 }
.fi
.SS "\fBSyntaxNode\fP * Parser::ParseNumeralStatement ()\fC [private]\fP"
.PP
Definition at line 531 of file parser\&.cpp\&.
.PP
References DecimalSystem::DecimalSystem(), errorNode, ErrorNode::ErrorNode(), Lexer::GetInput(), Number::GetIntegerValue(), Token::GetPos(), Token::GetText(), GetToken(), InputStatement::InputStatement(), lexer, OutputStatement::OutputStatement(), NumeralSystem::Parse(), PutToken(), symbin, Token::symbol, symdec, symdelimiter, symend, symhex, syminput, symnumber, symoct, syntaxError, and token\&.
.PP
Referenced by ParseStatement()\&.
.PP
.nf
532 {
533 Token *statement = token;
534 unsigned int base;
535
536 GetToken();
537 switch (token->symbol) {
538 case symend:
539 case symdelimiter:
540 PutToken();
541 return (statement->symbol == syminput) ?
542 (SyntaxNode*)new InputStatement() :
543 (SyntaxNode*)new OutputStatement();
544 case symbin:
545 base = 2;
546 break;
547 case symoct:
548 base = 8;
549 break;
550 case symdec:
551 base = 10;
552 break;
553 case symhex:
554 base = 16;
555 break;
556 default:
557 base = 0;
558 }
559
560 if (base == 0 && token->symbol != symnumber) {
561 syntaxError = token->GetPos();
562 return NOMEM;
563 }
564
565 if (base == 0) {
566 NumeralSystem *nsys = new DecimalSystem(0);
567 Number *number = nsys->Parse(token->GetText());
568 base = number->GetIntegerValue();
569 delete number;
570 delete nsys;
571
572 if (base < 2 || base > 32) {
573 errorNode = new ErrorNode(
574 lexer->GetInput(),
575 HELPPNUMERA,
576 token->GetText(),
577 token->GetPos());
578
579 return NOMEM;
580 }
581 }
582
583 return (statement->symbol == syminput) ?
584 (SyntaxNode*)new InputStatement(base) :
585 (SyntaxNode*)new OutputStatement(base);
586 }
.fi
.SS "\fBExpressionNode\fP * Parser::ParsePower ()\fC [private]\fP"
.PP
Definition at line 275 of file parser\&.cpp\&.
.PP
References GetToken(), ParseUnary(), PowerNode::PowerNode(), PutToken(), Token::symbol, sympower, and token\&.
.PP
Referenced by ParseFactor()\&.
.PP
.nf
276 {
277 ExpressionNode* node = ParseUnary ();
278
279 GetToken();
280 while (token->symbol == sympower) {
281 node = new PowerNode (node, ParseUnary ());
282 GetToken ();
283 }
284
285 PutToken();
286 return node;
287 }
.fi
.SS "\fBSyntaxNode\fP * Parser::ParsePrefsStatement ()\fC [private]\fP"
.PP
Definition at line 629 of file parser\&.cpp\&.
.PP
References GetToken(), PrefsStatement::PrefsStatement(), PutToken(), Token::symbol, symload, symsave, and token\&.
.PP
Referenced by ParseStatement()\&.
.PP
.nf
630 {
631 GetToken();
632 if (token->symbol == symload || token->symbol == symsave) {
633 return new PrefsStatement(token->symbol);
634 }
635
636 PutToken();
637 return new PrefsStatement();;
638 }
.fi
.SS "\fBSyntaxNode\fP * Parser::ParsePromptStatement ()\fC [private]\fP"
.PP
Definition at line 618 of file parser\&.cpp\&.
.PP
References Token::GetText(), GetToken(), PromptStatement::PromptStatement(), PutToken(), Token::symbol, symqident, and token\&.
.PP
Referenced by ParseStatement()\&.
.PP
.nf
619 {
620 GetToken();
621 if (token->symbol == symqident) {
622 return new PromptStatement(token->GetText());
623 }
624
625 PutToken();
626 return NOMEM;
627 }
.fi
.SS "\fBSyntaxNode\fP * Parser::ParseStatement ()\fC [private]\fP"
.PP
Definition at line 124 of file parser\&.cpp\&.
.PP
References ClearStatement::ClearStatement(), EvalStatement::EvalStatement(), ExitStatement::ExitStatement(), GetToken(), ListFunctionsStatement::ListFunctionsStatement(), ListVariablesStatement::ListVariablesStatement(), MemoryStatement::MemoryStatement(), ParseDefault(), ParseDeleteStatement(), ParseDigistStatement(), ParseDrawStatement(), ParseExpression(), ParseFileStatement(), ParseFunctionDef(), ParseHelpStatement(), ParseListStatement(), ParseNumeralStatement(), ParsePrefsStatement(), ParsePromptStatement(), PutToken(), Token::symbol, symclear, symdef, symdelete, symdigits, symdraw, symeval, symexecute, symexit, symfunction, symhelp, syminput, symlist, symload, symmem, symoutput, symplot, symprefs, symprompt, symsave, symshow, symvariable, symversion, token, and VersionStatement::VersionStatement()\&.
.PP
Referenced by TryParseStatement()\&.
.PP
.nf
125 {
126 SyntaxNode* res = NOMEM;
127
128 GetToken();
129 switch (token->symbol) {
130 case symhelp:
131 res = ParseHelpStatement();
132 break;
133 case symdelete:
134 res = ParseDeleteStatement();
135 break;
136 case symdef:
137 res = ParseFunctionDef();
138 break;
139 case symlist:
140 res = ParseListStatement();
141 break;
142 case symshow:
143 case symload:
144 case symsave:
145 case symexecute:
146 res = ParseFileStatement();
147 break;
148 case syminput:
149 case symoutput:
150 res = ParseNumeralStatement();
151 break;
152 case symprompt:
153 res = ParsePromptStatement();
154 break;
155 case symprefs:
156 res = ParsePrefsStatement();
157 break;
158 case symdigits:
159 res = ParseDigistStatement();
160 break;
161 case symdraw:
162 case symplot:
163 res = ParseDrawStatement();
164 break;
165 case symversion:
166 res = new VersionStatement();
167 break;
168 case symexit:
169 res = new ExitStatement();
170 break;
171 case symclear:
172 res = new ClearStatement();
173 break;
174 case symmem:
175 res = new MemoryStatement();
176 break;
177 case symvariable:
178 res = new ListVariablesStatement();
179 break;
180 case symfunction:
181 res = new ListFunctionsStatement();
182 break;
183 case symeval:
184 res = new EvalStatement(ParseExpression());
185 break;
186 default:
187 PutToken();
188 res = ParseDefault();
189 }
190
191 return res;
192 }
.fi
.SS "\fBExpressionNode\fP * Parser::ParseUnary ()\fC [private]\fP"
.PP
Definition at line 289 of file parser\&.cpp\&.
.PP
References GetToken(), ParseAtomic(), PutToken(), Token::symbol, symminus, token, and UnaryNode::UnaryNode()\&.
.PP
Referenced by ParsePower()\&.
.PP
.nf
290 {
291 ExpressionNode* node;
292
293 GetToken();
294 if (token->symbol == symminus) {
295 node = new UnaryNode(ParseAtomic ());
296 } else {
297 PutToken();
298 node = ParseAtomic();
299 }
300
301 return node;
302 }
.fi
.SS "void Parser::PutToken ()\fC [private]\fP"
.PP
Definition at line 406 of file parser\&.cpp\&.
.PP
References Token::GetLastToken(), and token\&.
.PP
Referenced by Parse(), ParseAddSubstract(), ParseDeleteStatement(), ParseDigistStatement(), ParseFactor(), ParseHelpStatement(), ParseIdent(), ParseListStatement(), ParseNumber(), ParseNumeralStatement(), ParsePower(), ParsePrefsStatement(), ParsePromptStatement(), ParseStatement(), ParseUnary(), and TryParseStatement()\&.
.PP
.nf
407 {
408 token = token->GetLastToken();
409 }
.fi
.SS "\fBSyntaxNode\fP * Parser::TryParseStatement ()\fC [private]\fP"
.PP
Definition at line 95 of file parser\&.cpp\&.
.PP
References errorNode, ErrorNode::ErrorNode(), Lexer::GetInput(), GetToken(), lexer, ParseStatement(), PutToken(), Token::symbol, symdelimiter, symend, syntaxError, and token\&.
.PP
Referenced by Parse()\&.
.PP
.nf
96 {
97 GetToken();
98 if(token->symbol == symend || token->symbol == symdelimiter) {
99 PutToken();
100 return NOMEM;
101 }
102 PutToken();
103
104 errorNode = NOMEM;
105 syntaxError = -1;
106 SyntaxNode *result = ParseStatement();
107
108 if (errorNode == NOMEM && syntaxError != -1) {
109 errorNode = new ErrorNode(lexer->GetInput(), syntaxError);
110 }
111
112 if (errorNode != NOMEM) {
113 delete result;
114 result = errorNode;
115 }
116
117 return result;
118 }
.fi
.SH "Member Data Documentation"
.PP
.SS "\fBErrorNode\fP* Parser::errorNode\fC [private]\fP"
.PP
Definition at line 68 of file parser\&.h\&.
.PP
Referenced by ParseDefault(), ParseDigistStatement(), ParseFunctionDef(), ParseIdent(), ParseNumeralStatement(), and TryParseStatement()\&.
.SS "\fBLexer\fP* Parser::lexer\fC [private]\fP"
.PP
Definition at line 64 of file parser\&.h\&.
.PP
Referenced by GetToken(), Parse(), ParseDigistStatement(), ParseFileStatement(), ParseFunctionDef(), ParseIdent(), ParseNumeralStatement(), Parser(), TryParseStatement(), and ~Parser()\&.
.SS "int Parser::syntaxError\fC [private]\fP"
.PP
Definition at line 67 of file parser\&.h\&.
.PP
Referenced by Expect(), ParseAtomic(), ParseDefault(), ParseDeleteStatement(), ParseDigistStatement(), ParseListStatement(), ParseNumeralStatement(), and TryParseStatement()\&.
.SS "\fBToken\fP* Parser::token\fC [private]\fP"
.PP
Definition at line 65 of file parser\&.h\&.
.PP
Referenced by Expect(), GetToken(), Parse(), ParseAddSubstract(), ParseAtomic(), ParseDefault(), ParseDeleteStatement(), ParseDigistStatement(), ParseDrawStatement(), ParseFactor(), ParseFileStatement(), ParseFunctionDef(), ParseHelpStatement(), ParseIdent(), ParseListStatement(), ParseNumber(), ParseNumeralStatement(), ParsePower(), ParsePrefsStatement(), ParsePromptStatement(), ParseStatement(), ParseUnary(), PutToken(), and TryParseStatement()\&.
.SH "Author"
.PP
Generated automatically by Doxygen for amath from the source code\&.