WSF
wizard/lib/source/Us/Parser.h
Go to the documentation of this file.
1// ****************************************************************************
2// CUI
3//
4// The Advanced Framework for Simulation, Integration, and Modeling (AFSIM)
5//
6// Copyright 2003-2015 The Boeing Company. All rights reserved.
7//
8// The use, dissemination or disclosure of data in this file is subject to
9// limitation or restriction. See accompanying README and LICENSE for details.
10// ****************************************************************************
11
12// NOTE: DO NOT HAND-EDIT THIS FILE! It is generated by the COCO/R compiler generator.
13// See wizard/lib/source/Us/AAA_README.TXT.
14
15#if !defined(Us_COCO_PARSER_H__)
16#define Us_COCO_PARSER_H__
17
18#include "Scanner.h"
19#include "UsCtx.hpp"
20#include "UsSymbolTable.hpp"
21
22namespace Us
23{
24
25class Errors
26{
27public:
28 int count{0}; // number of errors detected
29
30 Errors() = default;
31 virtual ~Errors() = default;
32
33 static char* GetStaticError(int aId);
34
35 virtual void SynErr(Token* tok, int n);
36 virtual void Error(Token* tok, const cocochar_t* s);
37 virtual void Warning(Token* tok, const cocochar_t* s);
38 virtual void Warning(const cocochar_t* s);
39 virtual void Exception(const cocochar_t* s);
40
41}; // Errors
42
43class Parser
44{
45public:
46 // ***Constants Header Begin
47 enum
48 {
49 _EOF = 0,
50 _ident = 1,
55 _dot = 6,
59 _assign = 10,
60 _eq = 11,
61 _ne = 12,
62 _ge = 13,
63 _le = 14,
64 _plus = 15,
65 _minus = 16,
66 _and = 17,
67 _or = 18,
68 _rbrace = 19,
69 _comma = 20,
75 _do = 26,
76 _if = 27,
77 _for = 28,
79 _in = 30,
80 _else = 31,
81 _while = 32,
82 _break = 33,
84 _return = 35,
85 _null = 36,
86 _null2 = 37,
87 _true = 38,
88 _false = 39,
89 _string = 40,
90 _int = 41,
91 _double = 42,
92 _char = 43,
93 _bool = 44,
94 _global = 45,
95 _static = 46,
96 _extern = 47,
97 _ppvar = 59,
99 };
100 int maxT;
101
102 // ***Constants Header End
103
104 // ***Declarations Begin - This section is a direct copy from .atg file
105 using Cx = Us::UsCtx;
106 using Ty = UsType;
107 using Fn = UsFunction;
108 using Val = Us::UsVal;
110 using Sy = UsSymbol;
111
113
115 {
116 if (la->kind != _ident)
117 return false;
118 Token* next = mScannerPtr->Peek();
119 switch (next->kind)
120 {
121 case _assign:
122 case _plus_assign:
123 case _minus_assign:
124 case _times_assign:
125 case _div_assign:
126 return true;
127 default:
128 return false;
129 }
130 }
131
132 // Look for '(' 'TYPE' ~('.')
133 bool IsCast(Cx& c)
134 {
135 bool isCast = false;
136 Token* next = mScannerPtr->Peek();
137 if (la->kind == _lparen && IsType(c, next))
138 {
139 isCast = true;
140 Token* nextNext = mScannerPtr->Peek();
141 if (nextNext->kind == _dot)
142 isCast = false;
143 }
144 mScannerPtr->ResetPeek();
145 return isCast;
146 }
147
149 {
150 if (la->kind == _comma)
151 {
152 Token* next = mScannerPtr->Peek();
153 return next->kind != _rbrace;
154 }
155 return false;
156 }
157
158 // Determine if the lookahead token is the name of a visible user-defined script or a class method call
159 // using an implied class reference such as '__BUILTIN__' or 'this'.
160 bool IsScript(Cx& c)
161 {
162 UsVal v = c.Search(la);
163 bool isScript = false;
164 if (v.IsScript())
165 {
166 // Call to user-defined script.
167 isScript = true;
168 }
169 else if (v.IsAppMethod())
170 {
171 // Call to a class method using an implied class reference.
172 isScript = true;
173 }
174 return isScript;
175 }
176
177 // Determine if the supplied token is a registered type
178 bool IsType(Cx& c, Token* tok) { return c.qType(tok) != nullptr; }
179
180 // Determine if the lookahead token is a registered type
181 bool IsType(Cx& c) { return c.qType(la) != nullptr; }
182
183 bool IsVarDecl(Cx& c)
184 {
185 if (la->kind == _global || la->kind == _static || la->kind == _extern)
186 return true;
187 if (IsType(c))
188 {
189 Token* next = mScannerPtr->Peek();
190 return !(next->kind == _dot || next->kind == _lparen);
191 }
192 return false;
193 }
194
195 void EOF_Token() { mRootCx->HitEOF(); }
196
197 // ***Declarations End
198
199 // Constructor and destructor
200 explicit Parser(Scanner* aScannerPtr);
201 Parser(const Parser& aSrc) = delete;
202 Parser& operator=(const Parser& aRhs) = delete;
203 virtual ~Parser();
204
205 void InitParse();
206 void Parse();
207
208 void SemErr(const cocochar_t* msg);
209
210 Scanner* mScannerPtr{nullptr}; // the scanner of this parser
211 Errors* mErrorsPtr{nullptr}; // error message stream
212
213 // Not following standard in order to keep actions brief
214 Token* t{nullptr}; // last recognized token
215 Token* la{nullptr}; // lookahead token; not yet parsed
216
217 // ***Production Header Begin
218 void Script();
219 void func_def(Cx& c);
220 void basic_type();
221 void type(Cx& c, Ty*& ty);
222 void identifier(Cx& c, Val& v);
223 void static_exp(Cx& c, Val& v);
224 void arg_list(Cx& c, ValList& args);
225 void exp(Cx& c, Val& v);
226 void block(Cx& c);
227 void stat(Cx& c);
228 void block_func(Cx& c);
229 void extern_stat(Cx& c);
230 void var_decl_expr(Cx& c, Val& v);
231 void var_decl(Cx& c);
232 void do_stat(Cx& c);
233 void bool_exp(Cx& c, Val& v);
234 void while_stat(Cx& c);
235 void assign_expr(Cx& c, Val& v);
236 void stat2(Cx& c);
237 void initializer_list(Cx& c, Val& v);
238 void AssignOp(int& op);
239 void exp1(Cx& c, Val& v);
240 void exp2(Cx& c, Val& v);
241 void exp3(Cx& c, Val& v);
242 void exp_eq(Cx& c, Val& v);
243 void EqOp(int& op);
244 void exp_test(Cx& c, Val& v);
245 void TestOp(int& op);
246 void exp_add(Cx& c, Val& v);
247 void AddOp(int& op);
248 void exp_mult(Cx& c, Val& v);
249 void MulOp(int& op);
250 void exp5(Cx& c, Val& v);
251 void exp6(Cx& c, Val& v);
252 void exp7(Cx& c, Val& v);
253 void atom(Cx& c, Val& v);
254 void trailer(Cx& c, Val& v);
255 void formal_param_list(Cx& c, Fn& f);
256
257 // ***Production Header End
258
259private:
260 void SynErr(int n);
261 void Get();
262 void Expect(int n);
263 bool StartOf(int s);
264 void ExpectWeak(int n, int follow);
265 bool WeakSeparator(int n, int syFol, int repFol);
266
267 Token* mDummyTokenPtr{nullptr};
268 int mErrDist{2};
269 int mMinErrDist{2};
270
271}; // end Parser
272
273} // namespace Us
274
275#endif
Definition UsSymbolTable.hpp:115
Definition UsSymbolTable.hpp:281
Definition UsSymbolTable.hpp:202
Definition wizard/lib/source/Us/Parser.h:26
static char * GetStaticError(int aId)
Definition wizard/lib/source/Us/Parser.cpp:1248
virtual void Warning(Token *tok, const cocochar_t *s)
Definition wizard/lib/source/Us/Parser.cpp:1517
int count
Definition wizard/lib/source/Us/Parser.h:28
virtual void SynErr(Token *tok, int n)
Definition wizard/lib/source/Us/Parser.cpp:1497
virtual void Exception(const cocochar_t *s)
Definition wizard/lib/source/Us/Parser.cpp:1527
Errors()=default
virtual ~Errors()=default
virtual void Error(Token *tok, const cocochar_t *s)
Definition wizard/lib/source/Us/Parser.cpp:1511
Scanner * mScannerPtr
Definition wizard/lib/source/Us/Parser.h:210
UsSymbol Sy
Definition wizard/lib/source/Us/Parser.h:110
void exp5(Cx &c, Val &v)
Definition wizard/lib/source/Us/Parser.cpp:862
bool IsAssignment()
Definition wizard/lib/source/Us/Parser.h:114
void EOF_Token()
Definition wizard/lib/source/Us/Parser.h:195
void trailer(Cx &c, Val &v)
Definition wizard/lib/source/Us/Parser.cpp:977
void identifier(Cx &c, Val &v)
Definition wizard/lib/source/Us/Parser.cpp:200
void initializer_list(Cx &c, Val &v)
Definition wizard/lib/source/Us/Parser.cpp:629
void exp(Cx &c, Val &v)
Definition wizard/lib/source/Us/Parser.cpp:282
void var_decl(Cx &c)
Definition wizard/lib/source/Us/Parser.cpp:495
void exp1(Cx &c, Val &v)
Definition wizard/lib/source/Us/Parser.cpp:698
bool IsType(Cx &c, Token *tok)
Definition wizard/lib/source/Us/Parser.h:178
void MulOp(int &op)
Definition wizard/lib/source/Us/Parser.cpp:846
void stat(Cx &c)
Definition wizard/lib/source/Us/Parser.cpp:298
void stat2(Cx &c)
Definition wizard/lib/source/Us/Parser.cpp:597
bool IsType(Cx &c)
Definition wizard/lib/source/Us/Parser.h:181
Token * la
Definition wizard/lib/source/Us/Parser.h:215
void exp_mult(Cx &c, Val &v)
Definition wizard/lib/source/Us/Parser.cpp:833
void while_stat(Cx &c)
Definition wizard/lib/source/Us/Parser.cpp:573
void Parse()
Definition wizard/lib/source/Us/Parser.cpp:1190
Token * t
Definition wizard/lib/source/Us/Parser.h:214
void exp7(Cx &c, Val &v)
Definition wizard/lib/source/Us/Parser.cpp:908
bool IsVarDecl(Cx &c)
Definition wizard/lib/source/Us/Parser.h:183
void SemErr(const cocochar_t *msg)
Definition wizard/lib/source/Us/Parser.cpp:29
void formal_param_list(Cx &c, Fn &f)
Definition wizard/lib/source/Us/Parser.cpp:1054
void EqOp(int &op)
Definition wizard/lib/source/Us/Parser.cpp:749
void TestOp(int &op)
Definition wizard/lib/source/Us/Parser.cpp:778
void block_func(Cx &c)
Definition wizard/lib/source/Us/Parser.cpp:429
Parser(const Parser &aSrc)=delete
Cx * mRootCx
Definition wizard/lib/source/Us/Parser.h:112
void basic_type()
Definition wizard/lib/source/Us/Parser.cpp:144
void exp6(Cx &c, Val &v)
Definition wizard/lib/source/Us/Parser.cpp:887
int maxT
Definition wizard/lib/source/Us/Parser.h:100
void InitParse()
Definition wizard/lib/source/Us/Parser.cpp:1183
bool IsInitializerEntry()
Definition wizard/lib/source/Us/Parser.h:148
void exp3(Cx &c, Val &v)
Definition wizard/lib/source/Us/Parser.cpp:726
void assign_expr(Cx &c, Val &v)
Definition wizard/lib/source/Us/Parser.cpp:587
UsType Ty
Definition wizard/lib/source/Us/Parser.h:106
bool IsScript(Cx &c)
Definition wizard/lib/source/Us/Parser.h:160
Errors * mErrorsPtr
Definition wizard/lib/source/Us/Parser.h:211
@ _foreach
Definition wizard/lib/source/Us/Parser.h:78
@ _else
Definition wizard/lib/source/Us/Parser.h:80
@ _int
Definition wizard/lib/source/Us/Parser.h:90
@ _real_number
Definition wizard/lib/source/Us/Parser.h:52
@ _do
Definition wizard/lib/source/Us/Parser.h:75
@ _plus
Definition wizard/lib/source/Us/Parser.h:64
@ _eq
Definition wizard/lib/source/Us/Parser.h:60
@ _times_assign
Definition wizard/lib/source/Us/Parser.h:72
@ _number
Definition wizard/lib/source/Us/Parser.h:51
@ _ppvarEnd
Definition wizard/lib/source/Us/Parser.h:98
@ _in
Definition wizard/lib/source/Us/Parser.h:79
@ _div_assign
Definition wizard/lib/source/Us/Parser.h:73
@ _true
Definition wizard/lib/source/Us/Parser.h:87
@ _dot
Definition wizard/lib/source/Us/Parser.h:55
@ _false
Definition wizard/lib/source/Us/Parser.h:88
@ _static
Definition wizard/lib/source/Us/Parser.h:95
@ _assign
Definition wizard/lib/source/Us/Parser.h:59
@ _return
Definition wizard/lib/source/Us/Parser.h:84
@ _double
Definition wizard/lib/source/Us/Parser.h:91
@ _comma
Definition wizard/lib/source/Us/Parser.h:69
@ _semicolon
Definition wizard/lib/source/Us/Parser.h:56
@ _lparen
Definition wizard/lib/source/Us/Parser.h:57
@ _rbrace
Definition wizard/lib/source/Us/Parser.h:68
@ _plus_assign
Definition wizard/lib/source/Us/Parser.h:70
@ _string_literal
Definition wizard/lib/source/Us/Parser.h:53
@ _le
Definition wizard/lib/source/Us/Parser.h:63
@ _bool
Definition wizard/lib/source/Us/Parser.h:93
@ _break
Definition wizard/lib/source/Us/Parser.h:82
@ _while
Definition wizard/lib/source/Us/Parser.h:81
@ _continue
Definition wizard/lib/source/Us/Parser.h:83
@ _null2
Definition wizard/lib/source/Us/Parser.h:86
@ _ge
Definition wizard/lib/source/Us/Parser.h:62
@ _minus_assign
Definition wizard/lib/source/Us/Parser.h:71
@ _rparen
Definition wizard/lib/source/Us/Parser.h:58
@ _minus
Definition wizard/lib/source/Us/Parser.h:65
@ _or
Definition wizard/lib/source/Us/Parser.h:67
@ _char_literal
Definition wizard/lib/source/Us/Parser.h:54
@ _if
Definition wizard/lib/source/Us/Parser.h:76
@ _for
Definition wizard/lib/source/Us/Parser.h:77
@ _ne
Definition wizard/lib/source/Us/Parser.h:61
@ _EOF
Definition wizard/lib/source/Us/Parser.h:49
@ _ident
Definition wizard/lib/source/Us/Parser.h:50
@ _r_arrow
Definition wizard/lib/source/Us/Parser.h:74
@ _extern
Definition wizard/lib/source/Us/Parser.h:96
@ _ppvar
Definition wizard/lib/source/Us/Parser.h:97
@ _and
Definition wizard/lib/source/Us/Parser.h:66
@ _null
Definition wizard/lib/source/Us/Parser.h:85
@ _char
Definition wizard/lib/source/Us/Parser.h:92
@ _string
Definition wizard/lib/source/Us/Parser.h:89
@ _global
Definition wizard/lib/source/Us/Parser.h:94
void extern_stat(Cx &c)
Definition wizard/lib/source/Us/Parser.cpp:438
void exp_test(Cx &c, Val &v)
Definition wizard/lib/source/Us/Parser.cpp:765
void exp2(Cx &c, Val &v)
Definition wizard/lib/source/Us/Parser.cpp:712
virtual ~Parser()
Definition wizard/lib/source/Us/Parser.cpp:1241
void block(Cx &c)
Definition wizard/lib/source/Us/Parser.cpp:287
bool IsCast(Cx &c)
Definition wizard/lib/source/Us/Parser.h:133
void AssignOp(int &op)
Definition wizard/lib/source/Us/Parser.cpp:667
void do_stat(Cx &c)
Definition wizard/lib/source/Us/Parser.cpp:552
Parser(Scanner *aScannerPtr)
Definition wizard/lib/source/Us/Parser.cpp:1197
void static_exp(Cx &c, Val &v)
Definition wizard/lib/source/Us/Parser.cpp:206
void func_def(Cx &c)
Definition wizard/lib/source/Us/Parser.cpp:125
Us::UsCtx Cx
Definition wizard/lib/source/Us/Parser.h:105
Parser & operator=(const Parser &aRhs)=delete
UsFunction Fn
Definition wizard/lib/source/Us/Parser.h:107
Us::UsValList ValList
Definition wizard/lib/source/Us/Parser.h:109
void arg_list(Cx &c, ValList &args)
Definition wizard/lib/source/Us/Parser.cpp:266
Us::UsVal Val
Definition wizard/lib/source/Us/Parser.h:108
void AddOp(int &op)
Definition wizard/lib/source/Us/Parser.cpp:817
void bool_exp(Cx &c, Val &v)
Definition wizard/lib/source/Us/Parser.cpp:568
void exp_add(Cx &c, Val &v)
Definition wizard/lib/source/Us/Parser.cpp:804
void var_decl_expr(Cx &c, Val &v)
Definition wizard/lib/source/Us/Parser.cpp:487
void Script()
Definition wizard/lib/source/Us/Parser.cpp:117
void atom(Cx &c, Val &v)
Definition wizard/lib/source/Us/Parser.cpp:917
void exp_eq(Cx &c, Val &v)
Definition wizard/lib/source/Us/Parser.cpp:736
void type(Cx &c, Ty *&ty)
Definition wizard/lib/source/Us/Parser.cpp:170
Definition wizard/lib/source/Us/Scanner.h:396
Definition wizard/lib/source/Us/Scanner.h:114
int kind
Definition wizard/lib/source/Us/Scanner.h:119
Definition UsCtx.hpp:204
Ty * qType(Token *t)
Definition UsCtx.cpp:323
UsSymbol * Search(const std::string &aName, int aDepth=100)
Definition UsCtx.hpp:260
Definition UsCtx.hpp:73
bool IsAppMethod() const
Definition UsCtx.hpp:105
bool IsScript() const
Definition UsCtx.hpp:111
Definition wizard/lib/source/Us/Parser.cpp:18
std::vector< UsVal > UsValList
Definition UsCtx.hpp:140
UsType Ty
Definition UsCtx.hpp:43
UsFunction Fn
Definition UsCtx.hpp:44
UsCtx Cx
Definition UsCtx.hpp:42
UsVal Val
Definition UsCtx.hpp:45
COCO_Str::char_type cocochar_t
Definition wizard/lib/source/Us/Scanner.h:76
Copyrights Multiple, All Rights Reserved