16 explicit Parser(
const std::vector<Token> &tokens);
20 std::vector<Token> tokens_;
22 size_t nestingDepth_ = 0;
23 static constexpr size_t MAX_NESTING_DEPTH = 200;
28 explicit NestingGuard(Parser &parser)
34 StackGuard::check(
"parser");
35 if (++p.nestingDepth_ > MAX_NESTING_DEPTH) {
36 throw std::runtime_error(
"Parse error at line " + std::to_string(p.current().line)
37 +
" col " + std::to_string(p.current().col)
38 +
": Expression or block nesting exceeds maximum supported depth ("
39 + std::to_string(MAX_NESTING_DEPTH) +
")");
42 ~NestingGuard() { --p.nestingDepth_; }
51 SourceLoc loc()
const;
54 const Token ¤t()
const;
55 const Token &peekToken(
int off = 0)
const;
57 bool check(TokenType t)
const;
58 bool match(TokenType t);
59 Token consume(TokenType t,
const std::string &msg =
"");
61 void skipTerminators();
68 bool consumeStmtTerminator(
ASTNode &node);
78 void skipPastComments();
81 bool isTerminator(std::initializer_list<TokenType> terminators)
const;
84 static double parseDouble(
const std::string &text,
int line,
int col);
87 bool isCommandStyleCall()
const;
88 ASTNodePtr parseCommandStyleCall();
91 ASTNodePtr parseStatement();
92 ASTNodePtr parseExpressionStatement();
93 ASTNodePtr tryMultiAssign();
95 ASTNodePtr parseFor();
96 ASTNodePtr parseWhile();
97 ASTNodePtr parseSwitch();
98 ASTNodePtr parseFunctionDef();
99 ASTNodePtr parseClassDef();
100 ASTNodePtr parseTryCatch();
101 ASTNodePtr parseGlobalPersistent();
102 ASTNodePtr parseBlock(std::initializer_list<TokenType> terminators);
105 ASTNodePtr parseExpression();
106 ASTNodePtr parseShortCircuitOr();
107 ASTNodePtr parseShortCircuitAnd();
108 ASTNodePtr parseElementOr();
109 ASTNodePtr parseElementAnd();
110 ASTNodePtr parseComparison();
111 ASTNodePtr parseColon();
112 ASTNodePtr parseAddSub();
113 ASTNodePtr parseMulDiv();
114 ASTNodePtr parseUnary();
115 ASTNodePtr parsePower();
116 ASTNodePtr parsePostfix();
117 ASTNodePtr parsePrimary();
120 ASTNodePtr parseArrayLiteral(TokenType open, TokenType close, NodeType nodeType);
121 ASTNodePtr parseMatrixLiteral();
122 ASTNodePtr parseCellLiteral();
123 ASTNodePtr parseAnonFunc();
126 std::string reconstructAnonSource(
size_t from,
size_t to)
const;
129 bool probeHasOutputSignature()
const;