Changes in / [a1e67dd:f0121d7]
- Files:
-
- 6 deleted
- 9 edited
-
doc/LaTeXmacros/common.tex (modified) (5 diffs)
-
doc/proposals/concurrency/.gitignore (deleted)
-
doc/proposals/concurrency/Makefile (modified) (4 diffs)
-
doc/proposals/concurrency/bump_ver.sh (deleted)
-
doc/proposals/concurrency/concurrency.tex (modified) (28 diffs)
-
doc/proposals/concurrency/ext_monitor.fig (deleted)
-
doc/proposals/concurrency/ext_monitor.fig.bak (deleted)
-
doc/proposals/concurrency/glossary.tex (modified) (1 diff)
-
doc/proposals/concurrency/monitor.fig (deleted)
-
doc/proposals/concurrency/version (deleted)
-
doc/user/user.tex (modified) (3 diffs)
-
src/Parser/lex.cc (modified) (27 diffs)
-
src/Parser/lex.ll (modified) (2 diffs)
-
src/Parser/parser.cc (modified) (494 diffs)
-
src/Parser/parser.yy (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
doc/LaTeXmacros/common.tex
ra1e67dd rf0121d7 1 1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -*- Mode: Latex -*- %%%%%%%%%%%%%%%%%%%%%%%%%%%% 2 %% 2 %% 3 3 %% Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo 4 4 %% 5 5 %% The contents of this file are covered under the licence agreement in the 6 6 %% file "LICENCE" distributed with Cforall. 7 %% 8 %% common.tex -- 9 %% 7 %% 8 %% common.tex -- 9 %% 10 10 %% Author : Peter A. Buhr 11 11 %% Created On : Sat Apr 9 10:06:17 2016 … … 41 41 \newcommand{\CCeleven}{\rm C\kern-.1em\hbox{+\kern-.25em+}11\xspace} % C++11 symbolic name 42 42 \newcommand{\Celeven}{C11\xspace} % C11 symbolic name 43 \newcommand{\Csharp}{\rm C\hbox{\#}\xspace} % C# symbolic name44 45 43 46 44 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% … … 126 124 \newcommand{\@sIndex}[2][\@empty]{#2\ifx#1\@empty\index{#2}\else\index{#1@{\protect#2}}\fi} 127 125 128 % inline text and code index (cannot use �)126 % inline text and code index (cannot use ©) 129 127 \newcommand{\Indexc}[1]{\lstinline$#1$\index{#1@\lstinline$#1$}} 130 % code index (cannot use �)128 % code index (cannot use ©) 131 129 \newcommand{\indexc}[1]{\index{#1@\lstinline$#1$}} 132 130 … … 228 226 229 227 % CFA programming language, based on ANSI C (with some gcc additions) 230 \lstdefinelanguage{Pseudo}{ 231 morekeywords={string,uint,int,bool,float},% 232 sensitive=true,% 233 morecomment=[l]{//},% 234 morecomment=[s]{/*}{*/},% 235 morestring=[b]',% 236 morestring=[b]",% 237 morestring=[s]{`}{`},% 228 \lstdefinelanguage{CFA}[ANSI]{C}{ 229 morekeywords={_Alignas,_Alignof,__alignof,__alignof__,asm,__asm,__asm__,_At,_Atomic,__attribute,__attribute__,auto, 230 _Bool,catch,catchResume,choose,_Complex,__complex,__complex__,__const,__const__,disable,dtype,enable,__extension__, 231 fallthrough,fallthru,finally,forall,ftype,_Generic,_Imaginary,inline,__label__,lvalue,_Noreturn,otype,restrict,_Static_assert, 232 _Thread_local,throw,throwResume,trait,try,typeof,__typeof,__typeof__,}, 238 233 }% 239 234 240 235 \lstset{ 241 language= Pseudo,236 language=CFA, 242 237 columns=fullflexible, 243 basicstyle=\linespread{0.9}\tt\small, % reduce line spacing and use typewriter font 244 stringstyle=\sf\color{Mahogany}, % use sanserif font 245 commentstyle=\itshape\color{OliveGreen}, % green and italic comments 246 tabsize=4, % 4 space tabbing 238 basicstyle=\linespread{0.9}\sf, % reduce line spacing and use sanserif font 239 stringstyle=\tt, % use typewriter font 240 tabsize=4, % 4 space tabbing 247 241 xleftmargin=\parindentlnth, % indent code to paragraph indentation 248 extendedchars=true, % allow ASCII characters in the range 128-255249 escapechar=§, % escape to latex in CFA code242 extendedchars=true, % allow ASCII characters in the range 128-255 243 escapechar=§, % escape to latex in CFA code 250 244 mathescape=true, % allow $...$ LaTeX math escapes in code 251 %keepspaces=true, % 245 %keepspaces=true, % 252 246 showstringspaces=false, % do not show spaces with cup 253 showlines=true, % show blank lines at end of code254 aboveskip=4pt, % spacing above/below code block247 showlines=true, % show blank lines at end of code 248 aboveskip=4pt, % spacing above/below code block 255 249 belowskip=3pt, 256 250 moredelim=**[is][\color{red}]{®}{®}, % red highlighting … … 259 253 moredelim=[is][\lstset{keywords={}}]{¶}{¶}, % temporarily turn off keywords 260 254 % replace/adjust listing characters that look bad in sanserif 261 literate={-}{\raisebox{-0.15ex}{\texttt{-}}}1 {^}{\raisebox{0.6ex}{$\scriptscriptstyle\land\,$}}1 {©}{{\"u}}1255 literate={-}{\raisebox{-0.15ex}{\texttt{-}}}1 {^}{\raisebox{0.6ex}{$\scriptscriptstyle\land\,$}}1 262 256 {~}{\raisebox{0.3ex}{$\scriptstyle\sim\,$}}1 {_}{\makebox[1.2ex][c]{\rule{1ex}{0.1ex}}}1 {`}{\ttfamily\upshape\hspace*{-0.1ex}`}1 263 257 {<-}{$\leftarrow$}2 {=>}{$\Rightarrow$}2, 264 258 }% 265 259 266 % CFA programming language, based on ANSI C (with some gcc additions)267 \lstdefinelanguage{CFA}[ANSI]{C}{268 morekeywords=[1]{_Alignas,_Alignof,__alignof,__alignof__,asm,__asm,__asm__,_At,_Atomic,__attribute,__attribute__,auto,269 _Bool,catch,catchResume,choose,_Complex,__complex,__complex__,__const,__const__,disable,dtype,enable,__extension__,270 fallthrough,fallthru,finally,forall,ftype,_Generic,_Imaginary,inline,__label__,lvalue,_Noreturn,otype,restrict,_Static_assert,271 _Thread_local,throw,throwResume,trait,try,typeof,__typeof,__typeof__,},272 morekeywords=[2]{mutex,nomutex,thread,wait,signal,accept,monitor}273 }%274 275 \lstset{276 language=CFA,277 columns=fullflexible,278 basicstyle=\linespread{0.9}\tt\small, % reduce line spacing and use typewriter font279 keywordstyle=[2]\color{blue}, % second set of keywords for concurency280 stringstyle=\sf\color{Mahogany}, % use sanserif font281 commentstyle=\itshape\color{OliveGreen}, % green and italic comments282 tabsize=4, % 4 space tabbing283 xleftmargin=\parindentlnth, % indent code to paragraph indentation284 extendedchars=true, % allow ASCII characters in the range 128-255285 escapechar=§, % escape to latex in CFA code286 mathescape=true, % allow $...$ LaTeX math escapes in code287 %keepspaces=true, %288 showstringspaces=false, % do not show spaces with cup289 showlines=true, % show blank lines at end of code290 aboveskip=4pt, % spacing above/below code block291 belowskip=3pt,292 moredelim=**[is][\color{red}]{®}{®}, % red highlighting293 moredelim=**[is][\color{blue}]{ß}{ß}, % blue highlighting294 moredelim=**[is][\color{OliveGreen}]{¢}{¢}, % green highlighting295 moredelim=[is][\lstset{keywords={}}]{¶}{¶}, % temporarily turn off keywords296 % replace/adjust listing characters that look bad in sanserif297 literate={-}{\raisebox{-0.15ex}{\texttt{-}}}1 {^}{\raisebox{0.6ex}{$\scriptscriptstyle\land\,$}}1 {©}{{\"u}}1298 {~}{\raisebox{0.3ex}{$\scriptstyle\sim\,$}}1 {_}{\makebox[1.2ex][c]{\rule{1ex}{0.1ex}}}1 {`}{\ttfamily\upshape\hspace*{-0.1ex}`}1299 {<-}{$\leftarrow$}2 {=>}{$\Rightarrow$}2,300 }%301 302 260 \lstMakeShortInline© % single-character for \lstinline 303 304 261 305 262 \let\Oldthebibliography\thebibliography -
doc/proposals/concurrency/Makefile
ra1e67dd rf0121d7 12 12 13 13 FIGURES = ${addsuffix .tex, \ 14 monitor \15 ext_monitor \16 14 } 17 15 … … 34 32 35 33 clean : 36 rm -f *.bbl *.aux *.dvi *.idx *.ilg *.ind *.brf *.out *.log *.toc *.blg *.pstex_t *.cf *.glg *.glo *.gls *.ist *.acn *.acr *.alg\34 rm -f *.bbl *.aux *.dvi *.idx *.ilg *.ind *.brf *.out *.log *.toc *.blg *.pstex_t *.cf *.glg *.glo *.gls *.ist \ 37 35 ${FIGURES} ${PICTURES} ${PROGRAMS} ${GRAPHS} ${basename ${DOCUMENT}}.ps ${DOCUMENT} 38 36 … … 60 58 # Run again to get index title into table of contents 61 59 ${LaTeX} ${basename $@}.tex 62 -./bump_ver.sh63 60 ${LaTeX} ${basename $@}.tex 64 61 … … 79 76 fig2dev -L pstex_t -p $@ $< > $@_t 80 77 81 82 78 # Local Variables: # 83 79 # compile-command: "make" # -
doc/proposals/concurrency/concurrency.tex
ra1e67dd rf0121d7 1 1 % requires tex packages: texlive-base texlive-latex-base tex-common texlive-humanities texlive-latex-extra texlive-fonts-recommended 2 2 3 % inline code ©...©(copyright symbol) emacs: C-q M-)4 % red highlighting ®...®(registered trademark symbol) emacs: C-q M-.5 % blue highlighting ß...ß(sharp s symbol) emacs: C-q M-_6 % green highlighting ¢...¢(cent symbol) emacs: C-q M-"7 % LaTex escape §...§(section symbol) emacs: C-q M-'8 % keyword escape ¶...¶(pilcrow symbol) emacs: C-q M-^3 % inline code �...� (copyright symbol) emacs: C-q M-) 4 % red highlighting �...� (registered trademark symbol) emacs: C-q M-. 5 % blue highlighting �...� (sharp s symbol) emacs: C-q M-_ 6 % green highlighting �...� (cent symbol) emacs: C-q M-" 7 % LaTex escape �...� (section symbol) emacs: C-q M-' 8 % keyword escape �...� (pilcrow symbol) emacs: C-q M-^ 9 9 % math escape $...$ (dollar symbol) 10 10 … … 24 24 \usepackage{graphicx} 25 25 \usepackage{tabularx} 26 \usepackage [acronym]{glossaries}26 \usepackage{glossaries} 27 27 \usepackage{varioref} % extended references 28 28 \usepackage{inconsolata} … … 33 33 \usepackage[usenames]{color} 34 34 \usepackage[pagewise]{lineno} 35 \usepackage{fancyhdr}36 35 \renewcommand{\linenumberfont}{\scriptsize\sffamily} 37 36 \input{common} % bespoke macros used in the document 38 37 \usepackage[dvips,plainpages=false,pdfpagelabels,pdfpagemode=UseNone,colorlinks=true,pagebackref=true,linkcolor=blue,citecolor=blue,urlcolor=blue,pagebackref=true,breaklinks=true]{hyperref} 39 38 \usepackage{breakurl} 40 41 \usepackage{tikz}42 \def\checkmark{\tikz\fill[scale=0.4](0,.35) -- (.25,0) -- (1,.7) -- (.25,.15) -- cycle;}43 39 44 40 \renewcommand{\UrlFont}{\small\sf} … … 62 58 \newcommand{\cit}{\textsuperscript{[Citation Needed]}\xspace} 63 59 \newcommand{\code}[1]{\lstinline{#1}} 64 \newcommand{\pseudo}[1]{\lstinline[language=Pseudo]{#1}}65 60 66 61 \input{glossary} … … 72 67 \setcounter{secnumdepth}{3} % number subsubsections 73 68 \setcounter{tocdepth}{3} % subsubsections in table of contents 74 % \linenumbers % comment out to turn off line numbering75 69 \makeindex 76 \pagestyle{fancy}77 \fancyhf{}78 \cfoot{\thepage}79 \rfoot{v\input{version}}80 70 81 71 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% … … 91 81 \maketitle 92 82 \section{Introduction} 93 This proposal provides a minimal core concurrency API that is both simple, efficient and can be reused to build higher-level features. The simplest possible core is a thread and a lock but this low-level approach is hard to master. An easier approach for users is to support higher-level construct as the basis of the concurrency in \CFA.94 Indeed, for hig hly productive parallel programming high-level approaches are much more popular\cite{HPP:Study}. Examples are task based parallelism, message passing, implicit threading.95 96 There are actually two problems that need to be solved in the design of the concurrency for a language. Which concurrency tools are available to the users and which parallelism tools are available. While these two concepts are often seen together, they are in fact distinct concepts that require different sorts of tools\cite{Buhr05a}. Concurrency tools need to handle mutual exclusion and synchronization while parallelism tools are more about performance, cost and res ource utilization.83 This proposal provides a minimal core concurrency API that is both simple, efficient and can be reused to build "higher level" features. The simplest possible core is a thread and a lock but this low level approach is hard to master. An easier approach for users is be to support higher level construct as the basis of the concurrency in \CFA. 84 Indeed, for higly productive parallel programming high-level approaches are much more popular\cite{HPP:Study}. Examples are task based parallelism, message passing, implicit threading. 85 86 There are actually two problems that need to be solved in the design of the concurrency for a language. Which concurrency tools are available to the users and which parallelism tools are available. While these two concepts are often seen together, they are in fact distinct concepts that require different sorts of tools\cite{Buhr05a}. Concurrency tools need to handle mutual exclusion and synchronization while parallelism tools are more about performance, cost and ressource utilisation. 97 87 98 88 \section{Concurrency} 99 Several tool can be used to solve concurrency challenges. Since these challenges always appear with the use of mutable shared state, some languages and libraries simply disallow mutable shared-state (Erlang\cite{Erlang}, Haskell\cite{Haskell}, Akka (Scala)\cite{Akka}). In these paradigms, interaction among concurrent objects rely on message passing or other paradigms that often closely relate to networking concepts. However, in imperative or OO languages, these approaches entail a clear distinction between concurrent and non-concurrent paradigms (i.e. message passing versus routine call). Which in turns mean that programmers need to learn two sets of designs patterns in order to be effective. Approaches based on shared memory are more closely related to non-concurrent paradigms since they often rely on non-concurrent constructs like routine calls and objects. At a lower level these can be implemented as locks and atomic operations. However, for productivity reasons it is desireable to have a higher-level construct to be the core concurrency paradigm\cite{HPP:Study}. This project proposes Monitors\cite{Hoare74} as the core concurrency construct. 100 \\ 89 Several tool can be used to solve concurrency challenges. Since these challenges always appear with the use of mutable shared state, some languages and libraries simply disallow mutable shared state completely (Erlang\cite{Erlang}, Haskell\cite{Haskell}, Akka (Scala)\cit). In the paradigms, interaction between concurrent objects rely on message passing or other paradigms that often closely relate to networking concepts. However, in imperative or OO languages these approaches entail a clear distinction between concurrent and non concurrent paradigms. Which in turns mean that programmers need to learn two sets of designs patterns in order to be effective at their jobs. Approaches based on shared memory are more closely related to non-concurrent paradigms since they often rely on non-concurrent constructs like routine calls and objects. At a lower level these can be implemented as locks and atomic operations. However for productivity reasons it is desireable to have a higher-level construct to be the core concurrency paradigm\cite{HPP:Study}. This paper proposes Monitors\cit as the core concurrency construct. 101 90 102 91 Finally, an approach that is worth mentionning because it is gaining in popularity is transactionnal memory\cite{Dice10}. However, the performance and feature set is currently too restrictive to be possible to add such a paradigm to a language like C or \CC\cit, which is why it was rejected as the core paradigm for concurrency in \CFA. 103 92 104 \s ubsection{Monitors}105 A monitor is a set of routines that ensure mutual exclusion when accessing shared state. This concept is generally associated with Object-Oriented Languages like Java\cite{Java} or \uC\cite{uC++book} but does not strictly require OOP semantics. The only requirements is t he abilityto declare a handle to a shared object and a set of routines that act on it :93 \section{Monitors} 94 A monitor is a set of routines that ensure mutual exclusion when accessing shared state. This concept is generally associated with Object-Oriented Languages like Java\cite{Java} or \uC\cite{uC++book} but does not strictly require OOP semantics. The only requirements is to be able to declare a handle to a shared object and a set of routines that act on it : 106 95 \begin{lstlisting} 107 96 typedef /*some monitor type*/ monitor; … … 114 103 \end{lstlisting} 115 104 116 \subsubsection{Call semantics} \label{call} 117 The above example of monitors already displays some of their intrinsic caracteristics. Indeed, it is necessary to use pass-by-reference over pass-by-value for monitor routines. This semantics is important because at their core, monitors are implicit mutual exclusion objects (locks), and these objects cannot be copied. Therefore, monitors are implicitly non-copyable. 118 \\ 119 120 Another aspect to consider is when a monitor acquires its mutual exclusion. Indeed, a monitor may need to be passed through multiple helper routines that do not acquire the monitor mutual exclusion on entry. Examples of this can be both generic helper routines (\code{swap}, \code{sort}, etc.) or specific helper routines like the following example : 105 \subsection{Call semantics} \label{call} 106 The above example of monitors already displays some of their intrinsic caracteristics. Indeed, it is necessary to use pass-by-reference over pass-by-value for monitor routines. This semantics is important because since at their core, monitors are simply implicit mutual exclusion objects (locks) and copying semantics of these is ill defined. Therefore, monitors are implicitly non-copyable. 107 108 Another aspect to consider is when a monitor acquires its mutual exclusion. Indeed, a monitor may need to be passed to helper routines that do not acquire the monitor mutual exclusion on entry. Examples of this can be both generic helper routines (\code{swap}, \code{sort}, etc.) or specific helper routines like the following example : 121 109 122 110 \begin{lstlisting} 123 111 mutex struct counter_t { /*...*/ }; 124 112 125 void ?{}(counter_t & nomutex this);113 void ?{}(counter_t & mutex this); 126 114 int ++?(counter_t & mutex this); 127 void ?{}(Int * this, counter_t & mutex cnt); 128 \end{lstlisting} 129 *semantics of the declaration of \code{mutex struct counter_t} are discussed in details in section \ref{data} 130 \\ 131 132 This example is of a monitor implementing an atomic counter. Here, the constructor uses the \code{nomutex} keyword to signify that it does not acquire the coroutine mutual exclusion when constructing. This is because object not yet constructed should never be shared and therefore do not require mutual exclusion. The prefix increment operator 133 uses \code{mutex} to protect the incrementing process from race conditions. Finally, we have a conversion operator from \code{counter_t} to \code{Int}. This conversion may or may not require the \code{mutex} key word depending whether or not reading an \code{Int} is an atomic operation or not. 134 \\ 115 void ?{}(int * this, counter_t & mutex cnt); 116 117 bool is_zero(counter_t & nomutex this) { 118 int val = this; 119 return val == 0; 120 } 121 \end{lstlisting} 122 *semantics of the declaration of \code{mutex struct counter_t} will be discussed in details in \ref{data} 123 124 This is an example of a monitor used as safe(ish) counter for concurrency. This API, which offers the prefix increment operator and a conversion operator to \code{int}, guarantees that reading the value (by converting it to \code{int}) and incrementing it are mutually exclusive. Note that the \code{is_zero} routine uses the \code{nomutex} keyword. Indeed, since reading the value is already atomic, there is no point in maintaining the mutual exclusion once the value is copied locally (in the variable \code{val} ). 135 125 136 126 Having both \code{mutex} and \code{nomutex} keywords could be argued to be redundant based on the meaning of a routine having neither of these keywords. If there were a meaning to routine \code{void foo(counter_t & this)} then one could argue that it should be to default to the safest option : \code{mutex}. On the other hand, the option of having routine \code{void foo(counter_t & this)} mean \code{nomutex} is unsafe by default and may easily cause subtle errors. It can be argued that this is the more "normal" behavior, \code{nomutex} effectively stating explicitly that "this routine has nothing special". An other alternative is to make one of these keywords mandatory, which would provide the same semantics but without the ambiguity of supporting routine \code{void foo(counter_t & this)}. Mandatory keywords would also have the added benefice of being more clearly self-documented but at the cost of extra typing. In the end, which solution should be picked is still up for debate. For the reminder of this proposal, the explicit approach will be used for the sake of clarity. 137 \\138 127 139 128 Regardless of which keyword is kept, it is important to establish when mutex/nomutex may be used depending on type parameters. 140 129 \begin{lstlisting} 141 int f1(monitor & mutex m); 142 int f2(const monitor & mutex m); 143 int f3(monitor ** mutex m); 144 int f4(monitor *[] mutex m); 145 int f5(graph(monitor*) & mutex m); 146 \end{lstlisting} 147 148 The problem is to indentify which object(s) should be acquired. Furthermore we also need to acquire each objects only once. In case of simple routines like \code{f1} and \code{f2} it is easy to identify an exhaustive list of objects to acquire on entering. Adding indirections (\code{f3}) still allows the compiler and programmer to indentify which object will be acquired. However, adding in arrays (\code{f4}) makes it much harder. Array lengths aren't necessarily known in C and even then making sure we only acquire objects once becomes also none trivial. This can be extended to absurd limits like \code{f5} which uses a custom graph of monitors. To keep everyone as sane as possible\cite{Chicken}, this projects imposes the requirement that a routine may only acquire one monitor per parameter and it must be the type of the parameter (ignoring potential qualifiers and indirections). 149 150 \subsubsection{Data semantics} \label{data} 130 int f01(monitor & mutex m); 131 int f02(const monitor & mutex m); 132 int f03(monitor * mutex m); 133 int f04(monitor * mutex * m); 134 int f05(monitor ** mutex m); 135 int f06(monitor[10] mutex m); 136 int f07(monitor[] mutex m); 137 int f08(vector(monitor) & mutex m); 138 int f09(list(monitor) & mutex m); 139 int f10([monitor*, int] & mutex m); 140 int f11(graph(monitor*) & mutex m); 141 \end{lstlisting} 142 143 For the first few routines it seems to make sense to support the mutex keyword for such small variations. The difference between pointers and reference (\code{f01} vs \code{f03}) or const and non-const (\code{f01} vs \code{f02}) has no significance to mutual exclusion. It may not always make sense to acquire the monitor when extra dereferences (\code{f04}, \code{f05}) are added but it is still technically feasible and the present of the explicit mutex keywork does make it very clear of the user's intentions. Passing in a known-sized array(\code{f06}) is also technically feasible but is close to the limits. Indeed, the size of the array is not actually enforced by the compiler and if replaced by a variable-sized array (\code{f07}) or a higher-level container (\code{f08}, \code{f09}) it becomes much more complex to properly acquire all the locks needed for such a complex critical section. This implicit acquisition also poses the question of what qualifies as a container. If the mutex keyword is supported on monitors stored inside of other types it can quickly become complex and unclear which monitor should be acquired and when. The extreme example of this is \code{f11} which takes a possibly cyclic graph of pointers to monitors. With such a routine signature the intuition of which monitors will be acquired on entry is lost\cite{Chicken}. Where to draw the lines is up for debate but it seems reasonnable to consider \code{f03} as accepted and \code{f06} as rejected. 144 145 \subsection{Data semantics} \label{data} 151 146 Once the call semantics are established, the next step is to establish data semantics. Indeed, until now a monitor is used simply as a generic handle but in most cases monitors contian shared data. This data should be intrinsic to the monitor declaration to prevent any accidental use of data without its appripriate protection. For example here is a more fleshed-out version of the counter showed in \ref{call}: 152 147 \begin{lstlisting} … … 155 150 }; 156 151 157 void ?{}(counter_t & nomutex this) {152 void ?{}(counter_t & mutex this) { 158 153 this.cnt = 0; 159 154 } … … 170 165 Thread 1 & Thread 2 \\ 171 166 \begin{lstlisting} 172 void f(counter_t & mutex c) {167 void main(counter_t & mutex c) { 173 168 for(;;) { 174 sout | (int)c | endl; 169 int count = c; 170 sout | count | endl; 175 171 } 176 172 } 177 173 \end{lstlisting} &\begin{lstlisting} 178 void g(counter_t & mutex c) {174 void main(counter_t & mutex c) { 179 175 for(;;) { 180 176 ++c; … … 198 194 \end{lstlisting} 199 195 200 This code acquires both locks before entering the critical section. In practice, writing multi-locking routines that can not lead to deadlocks can be very tricky. Having language level support for such feature is therefore a significant asset for \CFA. However, this does have significant repercussions relating to scheduling (see \ref{insched} and \ref{extsched}). Furthermore, the ability to acquire multiple monitors at the same time does incur a significant pitfall even without looking into scheduling. For example :196 This code acquires both locks before entering the critical section. In practice, writing multi-locking routines that can lead to deadlocks can be very tricky. Having language level support for such feature is therefore a significant asset for \CFA. However, as the this proposal shows, this does have significant repercussions relating to scheduling (see \ref{insched} and \ref{extsched}). The ability to acquire multiple monitors at the same time does incur a significant pitfall even without looking into scheduling. For example : 201 197 \begin{lstlisting} 202 198 void foo(A & mutex a, B & mutex a) { … … 217 213 \end{lstlisting} 218 214 219 Recursive mutex routine calls are allowed in \CFA but if not done carefully it can lead to nested monitor call problems\cite{Lister77}. These problems which are a specific implementation of the lock acquiring order problem. In the example above, the user uses implicit ordering in the case of function \code{bar} but explicit ordering in the case of \code{baz}. This subtle mistake can mean that calling these two functions concurrently will lead to deadlocks, depending on the implicit ordering matching the explicit ordering. As shown on several occasion\cit, there isn't really any solutions to this problem, users simply need to be carefull when acquiring multiple monitors at the same time. 220 221 \subsubsection{Implementation Details: Interaction with polymorphism} 222 At first glance, interaction between monitors and \CFA's concept of polymorphism seem complexe to support. However, it can be reasoned that entry-point locking can solve most of the issues that could be present with polymorphism. 223 224 First of all, interaction between \code{otype} polymorphism and monitors is impossible since monitors do not support copying. Therefore the main question is how to support \code{dtype} polymorphism. We must remember that monitors' main purpose is to ensure mutual exclusion when accessing shared data. This implies that mutual exclusion is only required for routines that do in fact access shared data. However, since \code{dtype} polymorphism always handle incomplete types (by definition) no \code{dtype} polymorphic routine can access shared data since the data would require knowledge about the type. Therefore the only concern when combining \code{dtype} polymorphism and monitors is to protect access to routines. With callsite-locking, this would require significant amount of work since any \code{dtype} routine could have to obtain some lock before calling a routine. However, with entry-point-locking calling a monitor routine becomes exactly the same as calling it from anywhere else. 225 226 \subsection{Internal scheduling} \label{insched} 215 TODO: dig further into monitor order aquiring 216 217 Thoughs : calls to \code{baz} and \code{bar} are definitely incompatible because they explicitly acquire locks in reverse order and therefore are explicitly asking for a deadlock. The best that can be done in this situatuin is to detect the deadlock. The case of implicit ordering is less clear because in the case of monitors the runtime system \textit{may} be smart enough to figure out that someone is waiting with explicit ordering... maybe. 218 219 \subsubsection{Internal scheduling} \label{insched} 227 220 Monitors should also be able to schedule what threads access it as a mean of synchronization. Internal scheduling is one of the simple examples of such a feature. It allows users to declare condition variables and wait for them to be signaled. Here is a simple example of such a technique : 228 221 … … 243 236 \end{lstlisting} 244 237 245 Here routine \code{foo} waits on the \code{signal} from \code{bar} before making further progress, effectively ensuring a basic ordering. This semanticcan easily be extended to multi-monitor calls by offering the same guarantee.238 Here routine \code{foo} waits on the \code{signal} from \code{bar} before making further progress, effectively ensuring a basic ordering. This can easily be extended to multi-monitor calls by offering the same guarantee. 246 239 247 240 \begin{center} … … 270 263 \end{center} 271 264 272 A direct extension of the single monitor semantics would be to release all locks when waiting and transferring ownership of all locks when signalling. However, for the purpose of synchronization it may be usefull to only release some of the locks but keep others. On the technical side, partially releasing lock is feasible but from the user perspective a choice must be made for the syntax of this feature. It is possible to do without any extra syntax by relying on order of acquisition (Note that here the use of helper routines is irrelevant, only routines the acquire mutual exclusion have an impact on internal scheduling):265 A direct extension of the single monitor semantics would be to release all locks when waiting and transferring ownership of all locks when signalling. However, for the purpose of synchronization it may be usefull to only release some of the locks but keep others. On the technical side, partially releasing lock is feasible but from the user perspective a choice must be made for the syntax of this feature. It is possible to do without any extra syntax by relying on order of acquisition : 273 266 274 267 \begin{center} … … 277 270 \hline 278 271 \begin{lstlisting} 279 condition e;280 281 272 void foo(monitor & mutex a, 282 273 monitor & mutex b) { 283 wait( e);274 wait(a.e); 284 275 } 285 276 … … 291 282 foo(a,b); 292 283 \end{lstlisting} &\begin{lstlisting} 293 condition e;294 295 284 void bar(monitor & mutex a, 296 285 monitor & nomutex b) { … … 300 289 void foo(monitor & mutex a, 301 290 monitor & mutex b) { 302 wait( e);291 wait(a.e); 303 292 } 304 293 305 294 bar(a, b); 306 295 \end{lstlisting} &\begin{lstlisting} 307 condition e;308 309 296 void bar(monitor & mutex a, 310 297 monitor & nomutex b) { … … 314 301 void baz(monitor & nomutex a, 315 302 monitor & mutex b) { 316 wait( e);303 wait(a.e); 317 304 } 318 305 … … 323 310 324 311 This can be interpreted in two different ways : 325 \begin{flushleft}326 312 \begin{enumerate} 327 \item \code{wait} atomically releases the monitors acquired by the inner-most routine, \underline{ignoring} nested calls.328 \item \code{wait} atomically releases the monitors acquired by the inner-most routine, \underline{considering} nested calls.313 \item \code{wait} atomically releases the monitors \underline{theoretically} acquired by the inner-most mutex routine. 314 \item \code{wait} atomically releases the monitors \underline{actually} acquired by the inner-most mutex routine. 329 315 \end{enumerate} 330 \end{flushleft} 331 While the difference between these two is subtle, it has a significant impact. In the first case it means that the calls to \code{foo} would behave the same in Context 1 and 2. This semantic would also mean that the call to \code{wait} in routine \code{baz} would only release \code{monitor b}. While this may seem intuitive with these examples, it does have one significant implication, it creates a strong distinction between acquiring multiple monitors in sequence and acquiring the same monitors simulatenously, i.e. : 316 While the difference between these two is subtle, it has a significant impact. In the first case it means that the calls to \code{foo} would behave the same in Context 1 and 2. This semantic would also mean that the call to \code{wait} in routine \code{baz} would only release \code{monitor b}. While this may seem intuitive with these examples, it does have one significant implication, it creates a strong distinction between acquiring multiple monitors in sequence and acquiring the same monitors simulatenously. 332 317 333 318 \begin{center} … … 349 334 \end{center} 350 335 351 This is not intuitive because even if both methods display the same monitors state both inside and outside the critical section respectively, the behavior is different. Furthermore, the actual acquiring order will be exaclty the same since acquiring a monitor from inside its mutual exclusion is a no-op. This means that even if the data and the actual control flow are the same using both methods, the behavior of the \code{wait} will be different. The alternative is option 2, that is releasing acquired monitors, \underline{considering} nesting. This solves the issue of having the two acquiring method differ at the cost of making routine \code{foo} behave differently depending on from which context it is called (Context 1 or 2). Indeed in Context 2, routine \code{foo} actually behaves like routine \code{baz} rather than having the same behavior than in Context 1. The fact that both implicit approaches can be unintuitive depending on the perspective may be a sign that the explicit approach is superior. For this reason this \CFA does not support implicit monitor releasing and uses explicit semantics.336 This is not intuitive because even if both methods will display the same monitors state both inside and outside the critical section respectively, the behavior is different. Furthermore, the actual acquiring order will be exaclty the same since acquiring a monitor from inside its mutual exclusion is a no-op. This means that even if the data and the actual control flow are the same using both methods, the behavior of the \code{wait} will be different. The alternative is option 2, that is releasing \underline{actually} acquired monitors. This solves the issue of having the two acquiring method differ at the cost of making routine \code{foo} behave differently depending on from which context it is called (Context 1 or 2). Indeed in Context 2, routine \code{foo} will actually behave like routine \code{baz} rather than having the same behavior than in context 1. The fact that both implicit approaches can be unintuitive depending on the perspective may be a sign that the explicit approach is superior. 352 337 \\ 353 338 … … 426 411 \\ 427 412 428 All these cases have the ir pros and cons. Case 1 is more distinct because it means programmers need to be carefull about where the condition is initialized as well as where it is used. On the other hand, it is very clear and explicitly states which monitor is released and which monitor stays acquired. This is similar to Case 2, which releases only the monitors explictly listed. However, in Case 2, calling the \code{wait} routine instead of the \code{waitRelease} routine releasesall the acquired monitor. The Case 3 is an improvement on that since it releases all the monitors except those specified. The result is that the \code{wait} routine can be written as follows :413 All these cases have there pros and cons. Case 1 is more distinct because it means programmers need to be carefull about where the condition was initialized as well as where it is used. On the other hand, it is very clear and explicit which monitor will be released and which monitor will stay acquired. This is similar to Case 2, which releases only the monitors explictly listed. However, in Case 2, calling the \code{wait} routine instead of the \code{waitRelease} routine will release all the acquired monitor. The Case 3 is an improvement on that since it releases all the monitors except those specified. The result is that the \code{wait} routine can be written as follows : 429 414 \begin{lstlisting} 430 415 void wait(condition & cond) { … … 434 419 This alternative offers nice and consistent behavior between \code{wait} and \code{waitHold}. However, one large pitfall is that mutual exclusion can now be violated by calls to library code. Indeed, even if the following example seems benign there is one significant problem : 435 420 \begin{lstlisting} 436 monitor global; 437 438 extern void doStuff(); //uses global 421 extern void doStuff(); 439 422 440 423 void foo(monitor & mutex m) { … … 443 426 //... 444 427 } 445 446 foo(global); 447 \end{lstlisting} 448 449 Indeed, if Case 2 or 3 are chosen it any code can violate the mutual exclusion of the calling code by issuing calls to \code{wait} or \code{waitHold} in a nested monitor context. Case 2 can be salvaged by removing the \code{wait} routine from the API but Case 3 cannot prevent users from calling \code{waitHold(someCondition, [])}. For this reason the syntax proposed in Case 3 is rejected. Note that the syntax proposed in case 1 and 2 are not exclusive. Indeed, by supporting two types of condition both cases can be supported : 428 \end{lstlisting} 429 430 Indeed, if Case 2 or 3 are chosen it any code can violate the mutual exclusion of calling code by issuing calls to \code{wait} or \code{waitHold} in a nested monitor context. Case 2 can be salvaged by removing the \code{wait} routine from the API but Case 3 cannot prevent users from calling \code{waitHold(someCondition, [])}. For this reason the syntax proposed in Case 3 is rejected. Note that syntaxes proposed in case 1 and 2 are not exclusive. Indeed, by supporting two types of condition as follows both cases can be supported : 450 431 \begin{lstlisting} 451 432 struct condition { /*...*/ }; … … 462 443 \end{lstlisting} 463 444 464 Regardless of the option chosen for wait semantics, signal must be symmetrical. In all cases, signal only needs a single parameter, the condition variable that needs to be signalled. But \code{signal} needs to be called from the same monitor(s) tha tcall to \code{wait}. Otherwise, mutual exclusion cannot be properly transferred back to the waiting monitor.445 Regardless of the option chosen for wait semantics, signal must be symmetrical. In all cases, signal only needs a single parameter, the condition variable that needs to be signalled. But \code{signal} needs to be called from the same monitor(s) than the call to \code{wait}. Otherwise, mutual exclusion cannot be properly transferred back to the waiting monitor. 465 446 466 447 Finally, an additionnal semantic which can be very usefull is the \code{signalBlock} routine. This routine behaves like signal for all of the semantics discussed above, but with the subtelty that mutual exclusion is transferred to the waiting task immediately rather than wating for the end of the critical section. 467 \\468 448 469 449 \subsection{External scheduling} \label{extsched} 470 As one might expect, the alternative to Internal scheduling is to use External scheduling instead. This method is somewhat more robust to deadlocks since one of the threads keeps a relatively tight control on scheduling. Indeed, as the following examples will demon strate, external scheduling allows users to wait for events from other threads without the concern of unrelated events occuring. External scheduling can generally be done either in terms of control flow (ex: \uC) or in terms of data (ex: Go). Of course, both of these paradigms have their own strenghts and weaknesses but for this project control flow semantics where chosen to stay consistent with the rest of the languages semantics. Two challenges specific to \CFA arise when trying to add external scheduling withloose object definitions and multi-monitor routines. The following example shows what a simple use \code{accept} versus \code{wait}/\code{signal} and its advantages.450 As one might expect, the alternative to Internal scheduling is to use External scheduling instead. This method is somewhat more robust to deadlocks since one of the threads keeps a relatively tight control on scheduling. Indeed, as the following examples will demontrate, external scheduling allows users to wait for events from other threads without the concern of unrelated events occuring. External scheduling can generally be done either in terms of control flow (see \uC) or in terms of data (see Go). Of course, both of these paradigms have their own strenghts and weaknesses but for this project control flow semantics where chosen to stay consistent with the reset of the languages semantics. Two challenges specific to \CFA arise when trying to add external scheduling which is loose object definitions and multi-monitor routines. The following example shows what a simple use \code{accept} versus \code{wait}/\code{signal} and its advantages. 471 451 472 452 \begin{center} … … 478 458 condition c; 479 459 public: 480 void f() { signal(c)} 481 void g() { wait(c); } 460 void f(); 461 void g() { signal} 462 void h() { wait(c); } 482 463 private: 483 464 } … … 487 468 public: 488 469 void f(); 489 void g() { _Accept(f); } 470 void g(); 471 void h() { _Accept(g); } 490 472 private: 491 473 } … … 495 477 496 478 In the case of internal scheduling, the call to \code{wait} only guarantees that \code{g} was the last routine to access the monitor. This intails that the routine \code{f} may have acquired mutual exclusion several times while routine \code{h} was waiting. On the other hand, external scheduling guarantees that while routine \code{h} was waiting, no routine other than \code{g} could acquire the monitor. 497 \\498 479 499 480 \subsubsection{Loose object definitions} 500 In \uC , monitor declarations include an exhaustive list of monitor operations. Since \CFA is not object oriented it becomes both more difficult to implement but alsoless clear for the user :481 In \uC monitor definitions include an exhaustive list of monitor operations. Since \CFA is not an object oriented it becomes much more difficult to implement but also much less clear for the user : 501 482 502 483 \begin{lstlisting} … … 504 485 505 486 void f(A & mutex a); 506 void g(A & mutex a) { accept(f); } 507 \end{lstlisting} 508 509 However, external scheduling is an example where implementation constraints become visible from the interface. Indeed, ince there is no hard limit to the number of threads trying to acquire a monitor concurrently, performance is a significant concern. Here is the pseudo code for the entering phase of a monitor : 487 void g(A & mutex a); 488 void h(A & mutex a) { accept(g); } 489 \end{lstlisting} 490 491 While this is the direct translation of the \uC code, at the time of compiling routine \code{f} the \CFA does not already have a declaration of \code{g} while the \uC compiler does. This means that either the compiler has to dynamically find which routines are "acceptable" or the language needs a way of statically listing "acceptable" routines. Since \CFA has no existing concept that resemble dynamic routine definitions or pattern matching, the static approach seems the more consistent with the current language paradigms. This approach leads to the \uC example being translated to : 492 \begin{lstlisting} 493 accept( void g(mutex struct A & mutex a) ) 494 mutex struct A {}; 495 496 void f(A & mutex a) { accept(g); } 497 void g(A & mutex a); 498 \end{lstlisting} 499 500 This syntax is the most consistent with the language since it somewhat mimics the \code{forall} declarations. However, the fact that it comes before the struct declaration does means the type needs to be forward declared (done inline in the example). Here are a few alternatives to this syntax : \\ 501 \begin{tabular}[t]{l l} 502 Alternative 1 & Alternative 2 \\ 503 \begin{lstlisting} 504 mutex struct A 505 accept( void g(A & mutex a) ) 506 {}; 507 \end{lstlisting} &\begin{lstlisting} 508 mutex struct A {} 509 accept( void g(A & mutex a) ); 510 511 \end{lstlisting} \\ 512 Alternative 3 & Alternative 4 \\ 513 \begin{lstlisting} 514 mutex struct A { 515 accept( void g(A & mutex a) ) 516 }; 517 518 \end{lstlisting} &\begin{lstlisting} 519 mutex struct A { 520 accept : 521 void g(A & mutex a) ); 522 }; 523 \end{lstlisting} 524 \end{tabular} 525 526 527 An other aspect to consider is what happens if multiple overloads of the same routine are used. For the time being it is assumed that multiple overloads of the same routine should be scheduled regardless of the overload used. However, this could easily be extended in the future. 528 529 \subsubsection{Multi-monitor scheduling} 530 531 External scheduling, like internal scheduling, becomes orders of magnitude more complex when we start introducing multi-monitor syntax. Even in the simplest possible case some new semantics need to be established : 532 \begin{lstlisting} 533 accept( void f(mutex struct A & mutex this)) 534 mutex struct A {}; 535 536 mutex struct B {}; 537 538 void g(A & mutex a, B & mutex b) { 539 accept(f); //ambiguous, which monitor 540 } 541 \end{lstlisting} 542 543 The obvious solution is to specify the correct monitor as follows : 544 545 \begin{lstlisting} 546 accept( void f(mutex struct A & mutex this)) 547 mutex struct A {}; 548 549 mutex struct B {}; 550 551 void g(A & mutex a, B & mutex b) { 552 accept( f, b ); 553 } 554 \end{lstlisting} 555 556 This is unambiguous. The both locks will be acquired and kept, when routine \code{f} is called the lock for monitor \code{a} will be temporarily transferred from \code{g} to \code{f} (while \code{g} still holds lock \code{b}). This behavior can be extended to multi-monitor accept statment as follows. 557 558 \begin{lstlisting} 559 accept( void f(mutex struct A & mutex, mutex struct A & mutex)) 560 mutex struct A {}; 561 562 mutex struct B {}; 563 564 void g(A & mutex a, B & mutex b) { 565 accept( f, b, a ); 566 } 567 \end{lstlisting} 568 569 Note that the set of monitors passed to the \code{accept} statement must be entirely contained in the set of monitor already acquired in the routine. \code{accept} used in any other context is Undefined Behaviour. 570 571 \subsection{Implementation Details} 572 \textbf{\large{Work in progress...}} 573 \subsubsection{Interaction with polymorphism} 574 At first glance, interaction between monitors and \CFA's concept of polymorphism seem complexe to support. However, it can be reasoned that entry-point locking can solve most of the issues that could be present with polymorphism. 575 576 First of all, interaction between \code{otype} polymorphism and monitors is impossible since monitors do not support copying. Therefore the main question is how to support \code{dtype} polymorphism. We must remember that monitors' main purpose is to ensure mutual exclusion when accessing shared data. This implies that mutual exclusion is only required for routines that do in fact access shared data. However, since \code{dtype} polymorphism always handle incomplete types (by definition) no \code{dtype} polymorphic routine can access shared data since the data would require knowledge about the type. Therefore the only concern when combining \code{dtype} polymorphism and monitors is to protect access to routines. With callsite-locking, this would require significant amount of work since any \code{dtype} routine could have to obtain some lock before calling a routine. However, with entry-point-locking calling a monitor routine becomes exactly the same as calling it from anywhere else. 577 578 \subsubsection{External scheduling queues} 579 To support multi-monitor external scheduling means that some kind of entry-queues must be used that is aware of both monitors. However, acceptable routines must be aware of the entry queues which means they most be stored inside at least one of the monitors that will be acquired. This in turn adds the requirement a systematic algorithm of disambiguating which queue is relavant regardless of user ordering. The proposed algorithm is to fall back on monitors lock ordering and specify that the monitor that is acquired first is the lock with the relevant entry queue. This assumes that the lock acquiring order is static for the lifetime of all concerned objects gut that is a reasonnable contraint. This algorithm choice has two consequences, the ofthe highest priority monitor is no longer a true FIFO queue and the queue of the lowest priority monitor is both required and probably unused. The queue can no longer be a FIFO queue because instead of simply containing the waiting threads in order arrival, they also contain the second mutex. Therefore, another thread with the same highest priority monitor but a different lowest priority monitor may arrive first but enter the critical section after a thread with the correct pairing. Secondly, since it may not be known at compile time which monitor will be the lowest priority monitor, every monitor needs to have the correct queues even though it is probably that half the multi-monitor queues will go unused for the entire duration of the program. 580 581 \subsection{Other concurrency tools} 582 583 \section{Parallelism} 584 Historically, computer performance was about processor speeds and instructions count. However, with heat dissipaction being an ever growing challenge, parallelism has become the new source of greatest performance \cite{Sutter05, Sutter05b}. In this decade, it is not longer reasonnable create high-performance application without caring about parallelism. Indeed, parallelism an important aspect of performance and more specifically throughput and hardware utilization. The lowest level approach parallelism is to use \glspl{kthread}. However since these have significant costs and limitations, \glspl{kthread} are now mostly used as an implementation tool rather than a user oriented one. There are several alternatives to solve these issues which all have strengths and weaknesses. 585 586 \subsection{User-level threads} 587 A direct improvement on the \gls{kthread} approach is to use \glspl{uthread}. These threads offer most of the same features that the operating system already provide but can be used on a much larger scale. This is the most powerfull solution as it allows all the features of multi-threading while removing several of the more expensives costs of using kernel threads. The down side is that almost none of the low-level threading complexities are hidden, users still have to think about data races, deadlocks and synchronization issues. This can be somewhat alleviated by a concurrency toolkit with strong garantees but the parallelism toolkit offers very little to reduce complexity in itself. 588 589 Examples of languages that support are Java\cite{Java}, Haskell\cite{Haskell} and \uC\cite{uC++book}. 590 591 \subsection{Jobs and thread pools} 592 The opposite approach is to base parallelism on \glspl{job}. Indeed, \glspl{job} offer limited flexibility but at the benefit of a simpler user interface. In \gls{job} based systems users express parallelism as units of work and the dependency graph (either explicit or implicit) that tie them together. This means users need not to worry about concurrency but significantly limits the interaction that can occur between different jobs. Indeed, any \gls{job} that blocks also blocks the underlying \gls{kthread}, this effectively mean the CPU utilization, and therefore throughput, will suffer noticeably. The golden standard of this implementation is Intel's TBB library\cite{TBB}. 593 594 \subsection{Fibers : user-level threads without preemption} 595 Finally, in the middle of the flexibility versus complexity spectrum lay \glspl{fiber} which offer \glspl{uthread} without the complexity of preemption. This means users don't have to worry about other \glspl{fiber} suddenly executing between two instructions which signficantly reduces complexity. However, any call to IO or other concurrency primitives can lead to context switches. Furthermore, users can also block \glspl{fiber} in the middle of their execution without blocking a full processor core. This means users still have to worry about mutual exclusion, deadlocks and race conditions in their code, raising the complexity significantly. 596 \cite{Go} 597 598 \subsection{Paradigm performance} 599 While the choice between the three paradigms listed above can have significant performance implication, it is difficult to pin the performance implications of chosing a model at the language level. Indeed, in many situations own of these paradigms will show better performance but it all depends on the usage. 600 Having mostly indepent units of work to execute almost guarantess that the \gls{job} based system will have the best performance. However, add interactions between jobs and the processor utilisation might suffer. User-level threads may allow maximum ressource utilisation but context switches will be more expansive and it is also harder for users to get perfect tunning. As with every example, fibers sit somewhat in the middle of the spectrum. 601 602 \section{Parallelism in \CFA} 603 As a system level language, \CFA should offer both performance and flexibilty as its primary goals, simplicity and user-friendliness being a secondary concern. Therefore, the core of parallelism in \CFA should prioritize power and efficiency. 604 605 \subsection{Kernel core}\label{kernel} 606 At the ro 607 \subsubsection{Threads} 608 \CFA threads have all the caracteristiques of 609 610 \subsection{High-level options}\label{tasks} 611 612 \subsubsection{Thread interface} 613 constructors destructors 614 initializer lists 615 monitors 616 617 \subsubsection{Futures} 618 619 \subsubsection{Implicit threading} 620 Finally, simpler applications can benefit greatly from having implicit parallelism. That is, parallelism that does not rely on the user to write concurrency. This type of parallelism can be achieved both at the language level and at the system level. 510 621 511 622 \begin{center} 512 \begin{tabular}{l} 513 \begin{lstlisting}[language=Pseudo] 514 if monitor is free : 515 enter 516 elif monitor accepts me : 517 enter 518 else : 519 block 623 \begin{tabular}[t]{|c|c|c|} 624 Sequential & System Parallel & Language Parallel \\ 625 \begin{lstlisting} 626 void big_sum(int* a, int* b, 627 int* out, 628 size_t length) 629 { 630 for(int i = 0; i < length; ++i ) { 631 out[i] = a[i] + b[i]; 632 } 633 } 634 635 636 637 638 639 int* a[10000]; 640 int* b[10000]; 641 int* c[10000]; 642 //... fill in a and b ... 643 big_sum(a, b, c, 10000); 644 \end{lstlisting} &\begin{lstlisting} 645 void big_sum(int* a, int* b, 646 int* out, 647 size_t length) 648 { 649 range ar(a, a + length); 650 range br(b, b + length); 651 range or(out, out + length); 652 parfor( ai, bi, oi, 653 [](int* ai, int* bi, int* oi) { 654 oi = ai + bi; 655 }); 656 } 657 658 int* a[10000]; 659 int* b[10000]; 660 int* c[10000]; 661 //... fill in a and b ... 662 big_sum(a, b, c, 10000); 663 \end{lstlisting}&\begin{lstlisting} 664 void big_sum(int* a, int* b, 665 int* out, 666 size_t length) 667 { 668 for (ai, bi, oi) in (a, b, out) { 669 oi = ai + bi; 670 } 671 } 672 673 674 675 676 677 int* a[10000]; 678 int* b[10000]; 679 int* c[10000]; 680 //... fill in a and b ... 681 big_sum(a, b, c, 10000); 520 682 \end{lstlisting} 521 683 \end{tabular} 522 684 \end{center} 523 685 524 For the \pseudo{monitor is free} condition it is easy to implement a check that can evaluate the condition in a few instruction. However, a fast check for \pseudo{monitor accepts me} is much harder to implement depending on the constraints put on the monitors. Indeed, monitors are often expressed as an entry queue and some acceptor queue as in the following figure : 525 526 \begin{center} 527 {\resizebox{0.4\textwidth}{!}{\input{monitor}}} 528 \end{center} 529 530 There are other alternatives to these pictures but in the case of this picture implementing a fast accept check is relatively easy. Indeed simply updating a bitmask when the acceptor queue changes is enough to have a check that executes in a single instruction, even with a fairly large number of acceptor. However, this relies on the fact that all the acceptable routines are declared with the monitor type. For OO languages this doesn't compromise much since monitors already have an exhaustive list of member routines. However, for \CFA this isn't the case, routines can be added to a type anywhere after its declaration. Its important to note that the bitmask approach does not actually require an exhaustive list of routines, but it requires a dense unique ordering of routines with an upper-bound and that ordering must be consistent across translation units. 531 The alternative would be to have a picture more like this one: 532 533 \begin{center} 534 {\resizebox{0.4\textwidth}{!}{\input{ext_monitor}}} 535 \end{center} 536 537 Not storing the queues inside the monitor means that the storage can vary between routines, allowing for more flexibility and extensions. Storing an array of function-pointers would solve the issue of uniquely identifying acceptable routines. However, the single instruction bitmask compare has been replaced by dereferencing a pointer followed by a linear search. Furthermore, supporting nested external scheduling may now require additionnal searches on calls to accept to check if a routine is already queued in. 538 539 At this point we must make a decision between flexibility and performance. Many design decisions in \CFA achieve both flexibility and performance, for example polymorphic routines add significant flexibility but inlining them means the optimizer can easily remove any runtime cost. Here however, the cost of flexibility cannot be trivially removed. 540 541 In either cases here are a few alternatives for the different syntaxes this syntax : \\ 542 \begin{center} 543 {\renewcommand{\arraystretch}{1.5} 544 \begin{tabular}[t]{l @{\hskip 0.35in} l} 545 \hline 546 \multicolumn{2}{ c }{\code{accept} on type}\\ 547 \hline 548 Alternative 1 & Alternative 2 \\ 549 \begin{lstlisting} 550 mutex struct A 551 accept( void f(A & mutex a) ) 552 {}; 553 \end{lstlisting} &\begin{lstlisting} 554 mutex struct A {} 555 accept( void f(A & mutex a) ); 556 557 \end{lstlisting} \\ 558 Alternative 3 & Alternative 4 \\ 559 \begin{lstlisting} 560 mutex struct A { 561 accept( void f(A & mutex a) ) 562 }; 563 564 \end{lstlisting} &\begin{lstlisting} 565 mutex struct A { 566 accept : 567 void f(A & mutex a) ); 568 }; 569 \end{lstlisting}\\ 570 \hline 571 \multicolumn{2}{ c }{\code{accept} on routine}\\ 572 \hline 573 \begin{lstlisting} 574 mutex struct A {}; 575 576 void f(A & mutex a) 577 578 accept( void f(A & mutex a) ) 579 void g(A & mutex a) { 580 /*...*/ 581 } 582 \end{lstlisting}&\\ 583 \end{tabular} 584 } 585 \end{center} 586 587 An other aspect to consider is what happens if multiple overloads of the same routine are used. For the time being it is assumed that multiple overloads of the same routine should be scheduled regardless of the overload used. However, this could easily be extended in the future. 588 589 \subsubsection{Multi-monitor scheduling} 590 591 External scheduling, like internal scheduling, becomes orders of magnitude more complex when we start introducing multi-monitor syntax. Even in the simplest possible case some new semantics need to be established : 592 \begin{lstlisting} 593 accept( void f(mutex struct A & mutex this)) 594 mutex struct A {}; 595 596 mutex struct B {}; 597 598 void g(A & mutex a, B & mutex b) { 599 accept(f); //ambiguous, which monitor 600 } 601 \end{lstlisting} 602 603 The obvious solution is to specify the correct monitor as follows : 604 605 \begin{lstlisting} 606 accept( void f(mutex struct A & mutex this)) 607 mutex struct A {}; 608 609 mutex struct B {}; 610 611 void g(A & mutex a, B & mutex b) { 612 accept( f, b ); 613 } 614 \end{lstlisting} 615 616 This is unambiguous. Both locks will be acquired and kept, when routine \code{f} is called the lock for monitor \code{a} will be temporarily transferred from \code{g} to \code{f} (while \code{g} still holds lock \code{b}). This behavior can be extended to multi-monitor accept statment as follows. 617 618 \begin{lstlisting} 619 accept( void f(mutex struct A & mutex, mutex struct A & mutex)) 620 mutex struct A {}; 621 622 mutex struct B {}; 623 624 void g(A & mutex a, B & mutex b) { 625 accept( f, b, a ); 626 } 627 \end{lstlisting} 628 629 Note that the set of monitors passed to the \code{accept} statement must be entirely contained in the set of monitor already acquired in the routine. \code{accept} used in any other context is Undefined Behaviour. 630 631 \subsubsection{Implementation Details: External scheduling queues} 632 To support multi-monitor external scheduling means that some kind of entry-queues must be used that is aware of both monitors. However, acceptable routines must be aware of the entry queues which means they must be stored inside at least one of the monitors that will be acquired. This in turn adds the requirement a systematic algorithm of disambiguating which queue is relavant regardless of user ordering. The proposed algorithm is to fall back on monitors lock ordering and specify that the monitor that is acquired first is the lock with the relevant entry queue. This assumes that the lock acquiring order is static for the lifetime of all concerned objects but that is a reasonnable constraint. This algorithm choice has two consequences, the entry queue of the highest priority monitor is no longer a true FIFO queue and the queue of the lowest priority monitor is both required and probably unused. The queue can no longer be a FIFO queue because instead of simply containing the waiting threads in order arrival, they also contain the second mutex. Therefore, another thread with the same highest priority monitor but a different lowest priority monitor may arrive first but enter the critical section after a thread with the correct pairing. Secondly, since it may not be known at compile time which monitor will be the lowest priority monitor, every monitor needs to have the correct queues even though it is probable that half the multi-monitor queues will go unused for the entire duration of the program. 633 634 \subsection{Other concurrency tools} 635 TO BE CONTINUED... 636 637 \newpage 638 \section{Parallelism} 639 Historically, computer performance was about processor speeds and instructions count. However, with heat dissipation being an ever growing challenge, parallelism has become the new source of greatest performance \cite{Sutter05, Sutter05b}. In this decade, it is not longer reasonnable to create high-performance application without caring about parallelism. Indeed, parallelism is an important aspect of performance and more specifically throughput and hardware utilization. The lowest level approach of parallelism is to use \glspl{kthread}. However since these have significant costs and limitations \glspl{kthread} are now mostly used as an implementation tool rather than a user oriented one. There are several alternatives to solve these issues which all have strengths and weaknesses. 640 641 \subsection{User-level threads} 642 A direct improvement on the \gls{kthread} approach is to use \glspl{uthread}. These threads offer most of the same features that the operating system already provide but can be used on a much larger scale. This is the most powerfull solution as it allows all the features of multi-threading while removing several of the more expensives costs of using kernel threads. The down side is that almost none of the low-level threading complexities are hidden, users still have to think about data races, deadlocks and synchronization issues. This can be somewhat alleviated by a concurrency toolkit with strong garantees but the parallelism toolkit offers very little to reduce complexity in itself. 643 644 Examples of languages that support are Java\cite{Java}, Haskell\cite{Haskell} and \uC\cite{uC++book}. 645 646 \subsection{Jobs and thread pools} 647 The approach on the opposite end of the spectrum is to base parallelism on \glspl{job}. Indeed, \glspl{job} offer limited flexibility but at the benefit of a simpler user interface. In \gls{job} based systems users express parallelism as units of work and the dependency graph (either explicit or implicit) that tie them together. This means users need not to worry about concurrency but significantly limits the interaction that can occur between different jobs. Indeed, any \gls{job} that blocks also blocks the underlying \gls{kthread}, this effectively mean the CPU utilization, and therefore throughput, will suffer noticeably. 648 The golden standard of this implementation is Intel's TBB library\cite{TBB}. 649 650 \subsection{Fibers : user-level threads without preemption} 651 Finally, in the middle of the flexibility versus complexity spectrum lay \glspl{fiber} which offer \glspl{uthread} without the complexity of preemption. This means users don't have to worry about other \glspl{fiber} suddenly executing between two instructions which signficantly reduces complexity. However, any call to IO or other concurrency primitives can lead to context switches. Furthermore, users can also block \glspl{fiber} in the middle of their execution without blocking a full processor core. This means users still have to worry about mutual exclusion, deadlocks and race conditions in their code, raising the complexity significantly. 652 An example of a language that uses fibers is Go\cite{Go} 653 654 \subsection{Paradigm performance} 655 While the choice between the three paradigms listed above may have significant performance implication, it is difficult to pin the performance implications of chosing a model at the language level. Indeed, in many situations one of these paradigms will show better performance but it all strongly depends on the usage. Having mostly indepent units of work to execute almost guarantess that the \gls{job} based system will have the best performance. However, add interactions between jobs and the processor utilisation might suffer. User-level threads may allow maximum ressource utilisation but context switches will be more expansive and it is also harder for users to get perfect tunning. As with every example, fibers sit somewhat in the middle of the spectrum. Furthermore, if the units of uninterrupted work are large enough the paradigm choice will be largely amorticised by the actual work done. 656 657 \section{\CFA 's Thread Building Blocks} 658 As a system level language, \CFA should offer both performance and flexibilty as its primary goals, simplicity and user-friendliness being a secondary concern. Therefore, the core of parallelism in \CFA should prioritize power and efficiency. With this said, it is possible to deconstruct the three paradigms details aboved in order to get simple building blocks. Here is a table showing the core caracteristics of the mentionned paradigms : 659 \begin{center} 660 \begin{tabular}[t]{| r | c | c |} 661 \cline{2-3} 662 \multicolumn{1}{ c| }{} & Has a stack & Preemptive \\ 663 \hline 664 \Glspl{job} & X & X \\ 665 \hline 666 \Glspl{fiber} & \checkmark & X \\ 667 \hline 668 \Glspl{uthread} & \checkmark & \checkmark \\ 669 \hline 670 \end{tabular} 671 \end{center} 672 673 As shown in section \ref{cfaparadigms} these different blocks being available in \CFA it is trivial to reproduce any of these paradigm. 674 675 \subsection{Thread Interface} 676 The basic building blocks of \CFA are \glspl{cfathread}. By default these are implemented as \glspl{uthread} and as such offer a flexible and lightweight threading interface (lightweight comparatievely to \glspl{kthread}). A thread can be declared using a struct declaration prefix with the \code{thread} as follows : 677 678 \begin{lstlisting} 679 thread struct foo {}; 680 \end{lstlisting} 681 682 Obviously, for this thread implementation to be usefull it must run some user code. Several other threading interfaces use some function pointer representation as the interface of threads (for example : \Csharp \cite{Csharp} and Scala \cite{Scala}). However, we consider that statically tying a \code{main} routine to a thread superseeds this approach. Since the \code{main} routine is definetely a special routine in \CFA, we can reuse the existing syntax for declaring routines with unordinary name, i.e. operator overloading. As such the \code{main} routine of a thread can be defined as such : 683 \begin{lstlisting} 684 thread struct foo {}; 685 686 void ?main(thread foo* this) { 687 /*... Some useful code ...*/ 688 } 689 \end{lstlisting} 690 691 With these semantics it is trivial to write a thread type that takes a function pointer as parameter and executes it on its stack asynchronously : 692 \begin{lstlisting} 693 typedef void (*voidFunc)(void); 694 695 thread struct FuncRunner { 696 voidFunc func; 697 }; 698 699 //ctor 700 void ?{}(thread FuncRunner* this, voidFunc inFunc) { 701 func = inFunc; 702 } 703 704 //main 705 void ?main(thread FuncRunner* this) { 706 this->func(); 707 } 708 \end{lstlisting} 709 710 % In this example \code{func} is a function pointer stored in \acrfull{tls}, which is \CFA is both easy to use and completly typesafe. 711 712 Of course for threads to be useful, it must be possible to start and stop threads and wait for them to complete execution. While using an \acrshort{api} such as \code{fork} and \code{join} is relatively common in the literature, such an interface is not needed. Indeed, the simplest approach is to use \acrshort{raii} principles and have threads \code{fork} once the constructor has completed and \code{join} before the destructor runs. 713 \begin{lstlisting} 714 thread struct FuncRunner; //FuncRunner declared above 715 716 void world() { 717 sout | "World!" | endl; 718 } 719 720 void main() { 721 FuncRunner run = {world}; 722 //Thread run forks here 723 724 //Print to "Hello " and "World!" will be run concurrently 725 sout | "Hello " | endl; 726 727 //Implicit join at end of scope 728 } 729 \end{lstlisting} 730 This semantic has several advantages over explicit semantics : typesafety is guaranteed, any thread will always be started and stopped exaclty once and users can't make any progamming errors. Furthermore it naturally follows the memory allocation semantics which means users don't need to learn multiple semantics. 731 732 These semantics also naturally scale to multiple threads meaning basic synchronisation is very simple : 733 \begin{lstlisting} 734 thread struct MyThread { 735 //... 736 }; 737 738 //ctor 739 void ?{}(thread MyThread* this) {} 740 741 //main 742 void ?main(thread MyThread* this) { 743 //... 744 } 745 746 void foo() { 747 MyThread thrds[10]; 748 //Start 10 threads at the beginning of the scope 749 750 DoStuff(); 751 752 //Wait for the 10 threads to finish 753 } 754 \end{lstlisting} 755 756 \newpage 757 \large{\textbf{WORK IN PROGRESS}} 758 \subsection{The \CFA Kernel : Processors, Clusters and Threads}\label{kernel} 759 760 761 \subsection{Paradigms}\label{cfaparadigms} 762 Given these building blocks we can then reproduce the all three of the popular paradigms. Indeed, we get \glspl{uthread} as the default paradigm in \CFA. However, disabling \glspl{preemption} on the \gls{cfacluster} means \glspl{cfathread} effectively become \glspl{fiber}. Since several \glspl{cfacluster} with different scheduling policy can coexist in the same application, this allows \glspl{fiber} and \glspl{uthread} to coexist in the runtime of an application. 763 764 % \subsection{High-level options}\label{tasks} 765 % 766 % \subsubsection{Thread interface} 767 % constructors destructors 768 % initializer lists 769 % monitors 770 % 771 % \subsubsection{Futures} 772 % 773 % \subsubsection{Implicit threading} 774 % Finally, simpler applications can benefit greatly from having implicit parallelism. That is, parallelism that does not rely on the user to write concurrency. This type of parallelism can be achieved both at the language level and at the system level. 775 % 776 % \begin{center} 777 % \begin{tabular}[t]{|c|c|c|} 778 % Sequential & System Parallel & Language Parallel \\ 779 % \begin{lstlisting} 780 % void big_sum(int* a, int* b, 781 % int* out, 782 % size_t length) 783 % { 784 % for(int i = 0; i < length; ++i ) { 785 % out[i] = a[i] + b[i]; 786 % } 787 % } 788 % 789 % 790 % 791 % 792 % 793 % int* a[10000]; 794 % int* b[10000]; 795 % int* c[10000]; 796 % //... fill in a and b ... 797 % big_sum(a, b, c, 10000); 798 % \end{lstlisting} &\begin{lstlisting} 799 % void big_sum(int* a, int* b, 800 % int* out, 801 % size_t length) 802 % { 803 % range ar(a, a + length); 804 % range br(b, b + length); 805 % range or(out, out + length); 806 % parfor( ai, bi, oi, 807 % [](int* ai, int* bi, int* oi) { 808 % oi = ai + bi; 809 % }); 810 % } 811 % 812 % int* a[10000]; 813 % int* b[10000]; 814 % int* c[10000]; 815 % //... fill in a and b ... 816 % big_sum(a, b, c, 10000); 817 % \end{lstlisting}&\begin{lstlisting} 818 % void big_sum(int* a, int* b, 819 % int* out, 820 % size_t length) 821 % { 822 % for (ai, bi, oi) in (a, b, out) { 823 % oi = ai + bi; 824 % } 825 % } 826 % 827 % 828 % 829 % 830 % 831 % int* a[10000]; 832 % int* b[10000]; 833 % int* c[10000]; 834 % //... fill in a and b ... 835 % big_sum(a, b, c, 10000); 836 % \end{lstlisting} 837 % \end{tabular} 838 % \end{center} 839 % 840 % \subsection{Machine setup}\label{machine} 841 % Threads are all good and well but wee still some OS support to fully utilize available hardware. 842 % 843 % \textbf{\large{Work in progress...}} Do wee need something beyond specifying the number of kernel threads? 844 845 \section{Putting it all together} 686 \subsection{Machine setup}\label{machine} 687 Threads are all good and well but wee still some OS support to fully utilize available hardware. 688 689 \textbf{\large{Work in progress...}} Do wee need something beyond specifying the number of kernel threads? 846 690 847 691 \section{Future work} … … 852 696 853 697 \clearpage 854 \printglossary[type=\acronymtype]855 698 \printglossary 856 699 -
doc/proposals/concurrency/glossary.tex
ra1e67dd rf0121d7 31 31 \textit{Synonyms : Tasks.} 32 32 } 33 34 \longnewglossaryentry{cfacluster}35 {name={cluster}}36 {37 TBD...38 39 \textit{Synonyms : None.}40 }41 42 \longnewglossaryentry{cfacpu}43 {name={processor}}44 {45 TBD...46 47 \textit{Synonyms : None.}48 }49 50 \longnewglossaryentry{cfathread}51 {name={thread}}52 {53 TBD...54 55 \textit{Synonyms : None.}56 }57 58 \longnewglossaryentry{preemption}59 {name={preemption}}60 {61 TBD...62 63 \textit{Synonyms : None.}64 }65 66 \newacronym{tls}{TLS}{Thread Local Storage}67 \newacronym{api}{API}{Application Program Interface}68 \newacronym{raii}{RAII}{Ressource Acquisition Is Initialization} -
doc/user/user.tex
ra1e67dd rf0121d7 11 11 %% Created On : Wed Apr 6 14:53:29 2016 12 12 %% Last Modified By : Peter A. Buhr 13 %% Last Modified On : Thu Sep 29 11:50:28201614 %% Update Count : 132 513 %% Last Modified On : Sun Aug 14 08:23:06 2016 14 %% Update Count : 1323 15 15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16 16 … … 33 33 \usepackage{textcomp} 34 34 \usepackage[latin1]{inputenc} 35 36 35 \usepackage{fullpage,times,comment} 37 36 \usepackage{epic,eepic} … … 1854 1853 case 1: case 2: case 3: ... 1855 1854 \end{lstlisting} 1856 still work s.1855 still work. 1857 1856 Nevertheless, reversing the default action would have a non-trivial effect on case actions that compound, such as the above example of processing shell arguments. 1857 <<<<<<< HEAD 1858 Therefore, to preserve backwards compatibility, it is necessary to introduce a new kind of ©switch© statement, called ©choose©, with no implicit fall-through semantics and an explicit fall-through if the last statement of a case-clause ends with the new keyword ©fallthru©, \eg: 1859 ======= 1858 1860 Therefore, to preserve backwards compatibility, it is necessary to introduce a new kind of ©switch© statement, called ©choose©, with no implicit fall-through semantics and an explicit fall-through if the last statement of a case-clause ends with the new keyword ©fallthrough©/©fallthru©, e.g.: 1861 >>>>>>> 080615890f586cb9954c252b55cab47f52c25758 1859 1862 \begin{lstlisting} 1860 1863 ®choose® ( i ) { -
src/Parser/lex.cc
ra1e67dd rf0121d7 1469 1469 * Created On : Sat Sep 22 08:58:10 2001 1470 1470 * Last Modified By : Peter A. Buhr 1471 * Last Modified On : Tue Oct 18 22:19:3720161472 * Update Count : 48 81471 * Last Modified On : Wed Aug 24 13:27:04 2016 1472 * Update Count : 487 1473 1473 */ 1474 1474 #line 20 "lex.ll" … … 1517 1517 1518 1518 // identifier, GCC: $ in identifier 1519 // quoted identifier 1519 1520 // attribute identifier, GCC: $ in identifier 1520 1521 // numeric constants, CFA: '_' in constant … … 1531 1532 1532 1533 1533 #line 153 4"Parser/lex.cc"1534 #line 1535 "Parser/lex.cc" 1534 1535 1535 1536 #define INITIAL 0 … … 1723 1724 register int yy_act; 1724 1725 1725 #line 13 6"lex.ll"1726 #line 139 "lex.ll" 1726 1727 1727 1728 /* line directives */ 1728 #line 17 29"Parser/lex.cc"1729 #line 1730 "Parser/lex.cc" 1729 1730 1730 1731 if ( !(yy_init) ) … … 1823 1824 /* rule 1 can match eol */ 1824 1825 YY_RULE_SETUP 1825 #line 1 38"lex.ll"1826 #line 141 "lex.ll" 1826 1827 { 1827 1828 /* " stop highlighting */ … … 1849 1850 /* rule 2 can match eol */ 1850 1851 YY_RULE_SETUP 1851 #line 16 0"lex.ll"1852 #line 163 "lex.ll" 1852 1853 ; 1853 1854 YY_BREAK … … 1855 1856 case 3: 1856 1857 YY_RULE_SETUP 1857 #line 16 3"lex.ll"1858 #line 166 "lex.ll" 1858 1859 { BEGIN COMMENT; } 1859 1860 YY_BREAK … … 1861 1862 /* rule 4 can match eol */ 1862 1863 YY_RULE_SETUP 1863 #line 16 4"lex.ll"1864 #line 167 "lex.ll" 1864 1865 ; 1865 1866 YY_BREAK 1866 1867 case 5: 1867 1868 YY_RULE_SETUP 1868 #line 16 5"lex.ll"1869 #line 168 "lex.ll" 1869 1870 { BEGIN 0; } 1870 1871 YY_BREAK … … 1873 1874 /* rule 6 can match eol */ 1874 1875 YY_RULE_SETUP 1875 #line 1 68"lex.ll"1876 #line 171 "lex.ll" 1876 1877 ; 1877 1878 YY_BREAK … … 1879 1880 case 7: 1880 1881 YY_RULE_SETUP 1881 #line 17 1"lex.ll"1882 #line 174 "lex.ll" 1882 1883 { WHITE_RETURN(' '); } 1883 1884 YY_BREAK 1884 1885 case 8: 1885 1886 YY_RULE_SETUP 1886 #line 17 2"lex.ll"1887 #line 175 "lex.ll" 1887 1888 { WHITE_RETURN(' '); } 1888 1889 YY_BREAK … … 1890 1891 /* rule 9 can match eol */ 1891 1892 YY_RULE_SETUP 1892 #line 17 3"lex.ll"1893 #line 176 "lex.ll" 1893 1894 { NEWLINE_RETURN(); } 1894 1895 YY_BREAK … … 1896 1897 case 10: 1897 1898 YY_RULE_SETUP 1898 #line 17 6"lex.ll"1899 #line 179 "lex.ll" 1899 1900 { KEYWORD_RETURN(ALIGNAS); } // C11 1900 1901 YY_BREAK 1901 1902 case 11: 1902 1903 YY_RULE_SETUP 1903 #line 1 77"lex.ll"1904 #line 180 "lex.ll" 1904 1905 { KEYWORD_RETURN(ALIGNOF); } // C11 1905 1906 YY_BREAK 1906 1907 case 12: 1907 1908 YY_RULE_SETUP 1908 #line 1 78"lex.ll"1909 #line 181 "lex.ll" 1909 1910 { KEYWORD_RETURN(ALIGNOF); } // GCC 1910 1911 YY_BREAK 1911 1912 case 13: 1912 1913 YY_RULE_SETUP 1913 #line 1 79"lex.ll"1914 #line 182 "lex.ll" 1914 1915 { KEYWORD_RETURN(ALIGNOF); } // GCC 1915 1916 YY_BREAK 1916 1917 case 14: 1917 1918 YY_RULE_SETUP 1918 #line 18 0"lex.ll"1919 #line 183 "lex.ll" 1919 1920 { KEYWORD_RETURN(ASM); } 1920 1921 YY_BREAK 1921 1922 case 15: 1922 1923 YY_RULE_SETUP 1923 #line 18 1"lex.ll"1924 #line 184 "lex.ll" 1924 1925 { KEYWORD_RETURN(ASM); } // GCC 1925 1926 YY_BREAK 1926 1927 case 16: 1927 1928 YY_RULE_SETUP 1928 #line 18 2"lex.ll"1929 #line 185 "lex.ll" 1929 1930 { KEYWORD_RETURN(ASM); } // GCC 1930 1931 YY_BREAK 1931 1932 case 17: 1932 1933 YY_RULE_SETUP 1933 #line 18 3"lex.ll"1934 #line 186 "lex.ll" 1934 1935 { KEYWORD_RETURN(AT); } // CFA 1935 1936 YY_BREAK 1936 1937 case 18: 1937 1938 YY_RULE_SETUP 1938 #line 18 4"lex.ll"1939 #line 187 "lex.ll" 1939 1940 { KEYWORD_RETURN(ATOMIC); } // C11 1940 1941 YY_BREAK 1941 1942 case 19: 1942 1943 YY_RULE_SETUP 1943 #line 18 5"lex.ll"1944 #line 188 "lex.ll" 1944 1945 { KEYWORD_RETURN(ATTRIBUTE); } // GCC 1945 1946 YY_BREAK 1946 1947 case 20: 1947 1948 YY_RULE_SETUP 1948 #line 18 6"lex.ll"1949 #line 189 "lex.ll" 1949 1950 { KEYWORD_RETURN(ATTRIBUTE); } // GCC 1950 1951 YY_BREAK 1951 1952 case 21: 1952 1953 YY_RULE_SETUP 1953 #line 1 87"lex.ll"1954 #line 190 "lex.ll" 1954 1955 { KEYWORD_RETURN(AUTO); } 1955 1956 YY_BREAK 1956 1957 case 22: 1957 1958 YY_RULE_SETUP 1958 #line 1 88"lex.ll"1959 #line 191 "lex.ll" 1959 1960 { KEYWORD_RETURN(BOOL); } // C99 1960 1961 YY_BREAK 1961 1962 case 23: 1962 1963 YY_RULE_SETUP 1963 #line 1 89"lex.ll"1964 #line 192 "lex.ll" 1964 1965 { KEYWORD_RETURN(BREAK); } 1965 1966 YY_BREAK 1966 1967 case 24: 1967 1968 YY_RULE_SETUP 1968 #line 19 0"lex.ll"1969 #line 193 "lex.ll" 1969 1970 { KEYWORD_RETURN(CASE); } 1970 1971 YY_BREAK 1971 1972 case 25: 1972 1973 YY_RULE_SETUP 1973 #line 19 1"lex.ll"1974 #line 194 "lex.ll" 1974 1975 { KEYWORD_RETURN(CATCH); } // CFA 1975 1976 YY_BREAK 1976 1977 case 26: 1977 1978 YY_RULE_SETUP 1978 #line 19 2"lex.ll"1979 #line 195 "lex.ll" 1979 1980 { KEYWORD_RETURN(CATCHRESUME); } // CFA 1980 1981 YY_BREAK 1981 1982 case 27: 1982 1983 YY_RULE_SETUP 1983 #line 19 3"lex.ll"1984 #line 196 "lex.ll" 1984 1985 { KEYWORD_RETURN(CHAR); } 1985 1986 YY_BREAK 1986 1987 case 28: 1987 1988 YY_RULE_SETUP 1988 #line 19 4"lex.ll"1989 #line 197 "lex.ll" 1989 1990 { KEYWORD_RETURN(CHOOSE); } // CFA 1990 1991 YY_BREAK 1991 1992 case 29: 1992 1993 YY_RULE_SETUP 1993 #line 19 5"lex.ll"1994 #line 198 "lex.ll" 1994 1995 { KEYWORD_RETURN(COMPLEX); } // C99 1995 1996 YY_BREAK 1996 1997 case 30: 1997 1998 YY_RULE_SETUP 1998 #line 19 6"lex.ll"1999 #line 199 "lex.ll" 1999 2000 { KEYWORD_RETURN(COMPLEX); } // GCC 2000 2001 YY_BREAK 2001 2002 case 31: 2002 2003 YY_RULE_SETUP 2003 #line 197"lex.ll"2004 #line 200 "lex.ll" 2004 2005 { KEYWORD_RETURN(COMPLEX); } // GCC 2005 2006 YY_BREAK 2006 2007 case 32: 2007 2008 YY_RULE_SETUP 2008 #line 198"lex.ll"2009 #line 201 "lex.ll" 2009 2010 { KEYWORD_RETURN(CONST); } 2010 2011 YY_BREAK 2011 2012 case 33: 2012 2013 YY_RULE_SETUP 2013 #line 199"lex.ll"2014 #line 202 "lex.ll" 2014 2015 { KEYWORD_RETURN(CONST); } // GCC 2015 2016 YY_BREAK 2016 2017 case 34: 2017 2018 YY_RULE_SETUP 2018 #line 20 0"lex.ll"2019 #line 203 "lex.ll" 2019 2020 { KEYWORD_RETURN(CONST); } // GCC 2020 2021 YY_BREAK 2021 2022 case 35: 2022 2023 YY_RULE_SETUP 2023 #line 20 1"lex.ll"2024 #line 204 "lex.ll" 2024 2025 { KEYWORD_RETURN(CONTINUE); } 2025 2026 YY_BREAK 2026 2027 case 36: 2027 2028 YY_RULE_SETUP 2028 #line 20 2"lex.ll"2029 #line 205 "lex.ll" 2029 2030 { KEYWORD_RETURN(DEFAULT); } 2030 2031 YY_BREAK 2031 2032 case 37: 2032 2033 YY_RULE_SETUP 2033 #line 20 3"lex.ll"2034 #line 206 "lex.ll" 2034 2035 { KEYWORD_RETURN(DISABLE); } // CFA 2035 2036 YY_BREAK 2036 2037 case 38: 2037 2038 YY_RULE_SETUP 2038 #line 20 4"lex.ll"2039 #line 207 "lex.ll" 2039 2040 { KEYWORD_RETURN(DO); } 2040 2041 YY_BREAK 2041 2042 case 39: 2042 2043 YY_RULE_SETUP 2043 #line 20 5"lex.ll"2044 #line 208 "lex.ll" 2044 2045 { KEYWORD_RETURN(DOUBLE); } 2045 2046 YY_BREAK 2046 2047 case 40: 2047 2048 YY_RULE_SETUP 2048 #line 20 6"lex.ll"2049 #line 209 "lex.ll" 2049 2050 { KEYWORD_RETURN(DTYPE); } // CFA 2050 2051 YY_BREAK 2051 2052 case 41: 2052 2053 YY_RULE_SETUP 2053 #line 2 07"lex.ll"2054 #line 210 "lex.ll" 2054 2055 { KEYWORD_RETURN(ELSE); } 2055 2056 YY_BREAK 2056 2057 case 42: 2057 2058 YY_RULE_SETUP 2058 #line 2 08"lex.ll"2059 #line 211 "lex.ll" 2059 2060 { KEYWORD_RETURN(ENABLE); } // CFA 2060 2061 YY_BREAK 2061 2062 case 43: 2062 2063 YY_RULE_SETUP 2063 #line 2 09"lex.ll"2064 #line 212 "lex.ll" 2064 2065 { KEYWORD_RETURN(ENUM); } 2065 2066 YY_BREAK 2066 2067 case 44: 2067 2068 YY_RULE_SETUP 2068 #line 21 0"lex.ll"2069 #line 213 "lex.ll" 2069 2070 { KEYWORD_RETURN(EXTENSION); } // GCC 2070 2071 YY_BREAK 2071 2072 case 45: 2072 2073 YY_RULE_SETUP 2073 #line 21 1"lex.ll"2074 #line 214 "lex.ll" 2074 2075 { KEYWORD_RETURN(EXTERN); } 2075 2076 YY_BREAK 2076 2077 case 46: 2077 2078 YY_RULE_SETUP 2078 #line 21 2"lex.ll"2079 #line 215 "lex.ll" 2079 2080 { KEYWORD_RETURN(FALLTHRU); } // CFA 2080 2081 YY_BREAK 2081 2082 case 47: 2082 2083 YY_RULE_SETUP 2083 #line 21 3"lex.ll"2084 #line 216 "lex.ll" 2084 2085 { KEYWORD_RETURN(FALLTHRU); } // CFA 2085 2086 YY_BREAK 2086 2087 case 48: 2087 2088 YY_RULE_SETUP 2088 #line 21 4"lex.ll"2089 #line 217 "lex.ll" 2089 2090 { KEYWORD_RETURN(FINALLY); } // CFA 2090 2091 YY_BREAK 2091 2092 case 49: 2092 2093 YY_RULE_SETUP 2093 #line 21 5"lex.ll"2094 #line 218 "lex.ll" 2094 2095 { KEYWORD_RETURN(FLOAT); } 2095 2096 YY_BREAK 2096 2097 case 50: 2097 2098 YY_RULE_SETUP 2098 #line 21 6"lex.ll"2099 #line 219 "lex.ll" 2099 2100 { KEYWORD_RETURN(FLOAT); } // GCC 2100 2101 YY_BREAK 2101 2102 case 51: 2102 2103 YY_RULE_SETUP 2103 #line 2 17"lex.ll"2104 #line 220 "lex.ll" 2104 2105 { KEYWORD_RETURN(FOR); } 2105 2106 YY_BREAK 2106 2107 case 52: 2107 2108 YY_RULE_SETUP 2108 #line 2 18"lex.ll"2109 #line 221 "lex.ll" 2109 2110 { KEYWORD_RETURN(FORALL); } // CFA 2110 2111 YY_BREAK 2111 2112 case 53: 2112 2113 YY_RULE_SETUP 2113 #line 2 19"lex.ll"2114 #line 222 "lex.ll" 2114 2115 { KEYWORD_RETURN(FORTRAN); } 2115 2116 YY_BREAK 2116 2117 case 54: 2117 2118 YY_RULE_SETUP 2118 #line 22 0"lex.ll"2119 #line 223 "lex.ll" 2119 2120 { KEYWORD_RETURN(FTYPE); } // CFA 2120 2121 YY_BREAK 2121 2122 case 55: 2122 2123 YY_RULE_SETUP 2123 #line 22 1"lex.ll"2124 #line 224 "lex.ll" 2124 2125 { KEYWORD_RETURN(GENERIC); } // C11 2125 2126 YY_BREAK 2126 2127 case 56: 2127 2128 YY_RULE_SETUP 2128 #line 22 2"lex.ll"2129 #line 225 "lex.ll" 2129 2130 { KEYWORD_RETURN(GOTO); } 2130 2131 YY_BREAK 2131 2132 case 57: 2132 2133 YY_RULE_SETUP 2133 #line 22 3"lex.ll"2134 #line 226 "lex.ll" 2134 2135 { KEYWORD_RETURN(IF); } 2135 2136 YY_BREAK 2136 2137 case 58: 2137 2138 YY_RULE_SETUP 2138 #line 22 4"lex.ll"2139 #line 227 "lex.ll" 2139 2140 { KEYWORD_RETURN(IMAGINARY); } // C99 2140 2141 YY_BREAK 2141 2142 case 59: 2142 2143 YY_RULE_SETUP 2143 #line 22 5"lex.ll"2144 #line 228 "lex.ll" 2144 2145 { KEYWORD_RETURN(IMAGINARY); } // GCC 2145 2146 YY_BREAK 2146 2147 case 60: 2147 2148 YY_RULE_SETUP 2148 #line 22 6"lex.ll"2149 #line 229 "lex.ll" 2149 2150 { KEYWORD_RETURN(IMAGINARY); } // GCC 2150 2151 YY_BREAK 2151 2152 case 61: 2152 2153 YY_RULE_SETUP 2153 #line 2 27"lex.ll"2154 #line 230 "lex.ll" 2154 2155 { KEYWORD_RETURN(INLINE); } // C99 2155 2156 YY_BREAK 2156 2157 case 62: 2157 2158 YY_RULE_SETUP 2158 #line 2 28"lex.ll"2159 #line 231 "lex.ll" 2159 2160 { KEYWORD_RETURN(INLINE); } // GCC 2160 2161 YY_BREAK 2161 2162 case 63: 2162 2163 YY_RULE_SETUP 2163 #line 2 29"lex.ll"2164 #line 232 "lex.ll" 2164 2165 { KEYWORD_RETURN(INLINE); } // GCC 2165 2166 YY_BREAK 2166 2167 case 64: 2167 2168 YY_RULE_SETUP 2168 #line 23 0"lex.ll"2169 #line 233 "lex.ll" 2169 2170 { KEYWORD_RETURN(INT); } 2170 2171 YY_BREAK 2171 2172 case 65: 2172 2173 YY_RULE_SETUP 2173 #line 23 1"lex.ll"2174 #line 234 "lex.ll" 2174 2175 { KEYWORD_RETURN(INT); } // GCC 2175 2176 YY_BREAK 2176 2177 case 66: 2177 2178 YY_RULE_SETUP 2178 #line 23 2"lex.ll"2179 #line 235 "lex.ll" 2179 2180 { KEYWORD_RETURN(LABEL); } // GCC 2180 2181 YY_BREAK 2181 2182 case 67: 2182 2183 YY_RULE_SETUP 2183 #line 23 3"lex.ll"2184 #line 236 "lex.ll" 2184 2185 { KEYWORD_RETURN(LONG); } 2185 2186 YY_BREAK 2186 2187 case 68: 2187 2188 YY_RULE_SETUP 2188 #line 23 4"lex.ll"2189 #line 237 "lex.ll" 2189 2190 { KEYWORD_RETURN(LVALUE); } // CFA 2190 2191 YY_BREAK 2191 2192 case 69: 2192 2193 YY_RULE_SETUP 2193 #line 23 5"lex.ll"2194 #line 238 "lex.ll" 2194 2195 { KEYWORD_RETURN(NORETURN); } // C11 2195 2196 YY_BREAK 2196 2197 case 70: 2197 2198 YY_RULE_SETUP 2198 #line 23 6"lex.ll"2199 #line 239 "lex.ll" 2199 2200 { KEYWORD_RETURN(OFFSETOF); } // GCC 2200 2201 YY_BREAK 2201 2202 case 71: 2202 2203 YY_RULE_SETUP 2203 #line 2 37"lex.ll"2204 #line 240 "lex.ll" 2204 2205 { KEYWORD_RETURN(OTYPE); } // CFA 2205 2206 YY_BREAK 2206 2207 case 72: 2207 2208 YY_RULE_SETUP 2208 #line 2 38"lex.ll"2209 #line 241 "lex.ll" 2209 2210 { KEYWORD_RETURN(REGISTER); } 2210 2211 YY_BREAK 2211 2212 case 73: 2212 2213 YY_RULE_SETUP 2213 #line 2 39"lex.ll"2214 #line 242 "lex.ll" 2214 2215 { KEYWORD_RETURN(RESTRICT); } // C99 2215 2216 YY_BREAK 2216 2217 case 74: 2217 2218 YY_RULE_SETUP 2218 #line 24 0"lex.ll"2219 #line 243 "lex.ll" 2219 2220 { KEYWORD_RETURN(RESTRICT); } // GCC 2220 2221 YY_BREAK 2221 2222 case 75: 2222 2223 YY_RULE_SETUP 2223 #line 24 1"lex.ll"2224 #line 244 "lex.ll" 2224 2225 { KEYWORD_RETURN(RESTRICT); } // GCC 2225 2226 YY_BREAK 2226 2227 case 76: 2227 2228 YY_RULE_SETUP 2228 #line 24 2"lex.ll"2229 #line 245 "lex.ll" 2229 2230 { KEYWORD_RETURN(RETURN); } 2230 2231 YY_BREAK 2231 2232 case 77: 2232 2233 YY_RULE_SETUP 2233 #line 24 3"lex.ll"2234 #line 246 "lex.ll" 2234 2235 { KEYWORD_RETURN(SHORT); } 2235 2236 YY_BREAK 2236 2237 case 78: 2237 2238 YY_RULE_SETUP 2238 #line 24 4"lex.ll"2239 #line 247 "lex.ll" 2239 2240 { KEYWORD_RETURN(SIGNED); } 2240 2241 YY_BREAK 2241 2242 case 79: 2242 2243 YY_RULE_SETUP 2243 #line 24 5"lex.ll"2244 #line 248 "lex.ll" 2244 2245 { KEYWORD_RETURN(SIGNED); } // GCC 2245 2246 YY_BREAK 2246 2247 case 80: 2247 2248 YY_RULE_SETUP 2248 #line 24 6"lex.ll"2249 #line 249 "lex.ll" 2249 2250 { KEYWORD_RETURN(SIGNED); } // GCC 2250 2251 YY_BREAK 2251 2252 case 81: 2252 2253 YY_RULE_SETUP 2253 #line 2 47"lex.ll"2254 #line 250 "lex.ll" 2254 2255 { KEYWORD_RETURN(SIZEOF); } 2255 2256 YY_BREAK 2256 2257 case 82: 2257 2258 YY_RULE_SETUP 2258 #line 2 48"lex.ll"2259 #line 251 "lex.ll" 2259 2260 { KEYWORD_RETURN(STATIC); } 2260 2261 YY_BREAK 2261 2262 case 83: 2262 2263 YY_RULE_SETUP 2263 #line 2 49"lex.ll"2264 #line 252 "lex.ll" 2264 2265 { KEYWORD_RETURN(STATICASSERT); } // C11 2265 2266 YY_BREAK 2266 2267 case 84: 2267 2268 YY_RULE_SETUP 2268 #line 25 0"lex.ll"2269 #line 253 "lex.ll" 2269 2270 { KEYWORD_RETURN(STRUCT); } 2270 2271 YY_BREAK 2271 2272 case 85: 2272 2273 YY_RULE_SETUP 2273 #line 25 1"lex.ll"2274 #line 254 "lex.ll" 2274 2275 { KEYWORD_RETURN(SWITCH); } 2275 2276 YY_BREAK 2276 2277 case 86: 2277 2278 YY_RULE_SETUP 2278 #line 25 2"lex.ll"2279 #line 255 "lex.ll" 2279 2280 { KEYWORD_RETURN(THREADLOCAL); } // C11 2280 2281 YY_BREAK 2281 2282 case 87: 2282 2283 YY_RULE_SETUP 2283 #line 25 3"lex.ll"2284 #line 256 "lex.ll" 2284 2285 { KEYWORD_RETURN(THROW); } // CFA 2285 2286 YY_BREAK 2286 2287 case 88: 2287 2288 YY_RULE_SETUP 2288 #line 25 4"lex.ll"2289 #line 257 "lex.ll" 2289 2290 { KEYWORD_RETURN(THROWRESUME); } // CFA 2290 2291 YY_BREAK 2291 2292 case 89: 2292 2293 YY_RULE_SETUP 2293 #line 25 5"lex.ll"2294 #line 258 "lex.ll" 2294 2295 { KEYWORD_RETURN(TRAIT); } // CFA 2295 2296 YY_BREAK 2296 2297 case 90: 2297 2298 YY_RULE_SETUP 2298 #line 25 6"lex.ll"2299 #line 259 "lex.ll" 2299 2300 { KEYWORD_RETURN(TRY); } // CFA 2300 2301 YY_BREAK 2301 2302 case 91: 2302 2303 YY_RULE_SETUP 2303 #line 2 57"lex.ll"2304 #line 260 "lex.ll" 2304 2305 { KEYWORD_RETURN(TYPEDEF); } 2305 2306 YY_BREAK 2306 2307 case 92: 2307 2308 YY_RULE_SETUP 2308 #line 2 58"lex.ll"2309 #line 261 "lex.ll" 2309 2310 { KEYWORD_RETURN(TYPEOF); } // GCC 2310 2311 YY_BREAK 2311 2312 case 93: 2312 2313 YY_RULE_SETUP 2313 #line 2 59"lex.ll"2314 #line 262 "lex.ll" 2314 2315 { KEYWORD_RETURN(TYPEOF); } // GCC 2315 2316 YY_BREAK 2316 2317 case 94: 2317 2318 YY_RULE_SETUP 2318 #line 26 0"lex.ll"2319 #line 263 "lex.ll" 2319 2320 { KEYWORD_RETURN(TYPEOF); } // GCC 2320 2321 YY_BREAK 2321 2322 case 95: 2322 2323 YY_RULE_SETUP 2323 #line 26 1"lex.ll"2324 #line 264 "lex.ll" 2324 2325 { KEYWORD_RETURN(UNION); } 2325 2326 YY_BREAK 2326 2327 case 96: 2327 2328 YY_RULE_SETUP 2328 #line 26 2"lex.ll"2329 #line 265 "lex.ll" 2329 2330 { KEYWORD_RETURN(UNSIGNED); } 2330 2331 YY_BREAK 2331 2332 case 97: 2332 2333 YY_RULE_SETUP 2333 #line 26 3"lex.ll"2334 #line 266 "lex.ll" 2334 2335 { KEYWORD_RETURN(VALIST); } // GCC 2335 2336 YY_BREAK 2336 2337 case 98: 2337 2338 YY_RULE_SETUP 2338 #line 26 4"lex.ll"2339 #line 267 "lex.ll" 2339 2340 { KEYWORD_RETURN(VOID); } 2340 2341 YY_BREAK 2341 2342 case 99: 2342 2343 YY_RULE_SETUP 2343 #line 26 5"lex.ll"2344 #line 268 "lex.ll" 2344 2345 { KEYWORD_RETURN(VOLATILE); } 2345 2346 YY_BREAK 2346 2347 case 100: 2347 2348 YY_RULE_SETUP 2348 #line 26 6"lex.ll"2349 #line 269 "lex.ll" 2349 2350 { KEYWORD_RETURN(VOLATILE); } // GCC 2350 2351 YY_BREAK 2351 2352 case 101: 2352 2353 YY_RULE_SETUP 2353 #line 2 67"lex.ll"2354 #line 270 "lex.ll" 2354 2355 { KEYWORD_RETURN(VOLATILE); } // GCC 2355 2356 YY_BREAK 2356 2357 case 102: 2357 2358 YY_RULE_SETUP 2358 #line 2 68"lex.ll"2359 #line 271 "lex.ll" 2359 2360 { KEYWORD_RETURN(WHILE); } 2360 2361 YY_BREAK … … 2362 2363 case 103: 2363 2364 YY_RULE_SETUP 2364 #line 271 "lex.ll"2365 { IDENTIFIER_RETURN(); }2366 YY_BREAK2367 case 104:2368 YY_RULE_SETUP2369 #line 272 "lex.ll"2370 { ATTRIBUTE_RETURN(); }2371 YY_BREAK2372 case 105:2373 YY_RULE_SETUP2374 #line 273 "lex.ll"2375 { BEGIN BKQUOTE; }2376 YY_BREAK2377 case 106:2378 YY_RULE_SETUP2379 2365 #line 274 "lex.ll" 2380 2366 { IDENTIFIER_RETURN(); } 2381 2367 YY_BREAK 2368 case 104: 2369 YY_RULE_SETUP 2370 #line 275 "lex.ll" 2371 { ATTRIBUTE_RETURN(); } 2372 YY_BREAK 2373 case 105: 2374 YY_RULE_SETUP 2375 #line 276 "lex.ll" 2376 { BEGIN BKQUOTE; } 2377 YY_BREAK 2378 case 106: 2379 YY_RULE_SETUP 2380 #line 277 "lex.ll" 2381 { IDENTIFIER_RETURN(); } 2382 YY_BREAK 2382 2383 case 107: 2383 2384 YY_RULE_SETUP 2384 #line 27 5"lex.ll"2385 #line 278 "lex.ll" 2385 2386 { BEGIN 0; } 2386 2387 YY_BREAK … … 2388 2389 case 108: 2389 2390 YY_RULE_SETUP 2390 #line 2 78"lex.ll"2391 #line 281 "lex.ll" 2391 2392 { NUMERIC_RETURN(ZERO); } // CFA 2392 2393 YY_BREAK 2393 2394 case 109: 2394 2395 YY_RULE_SETUP 2395 #line 2 79"lex.ll"2396 #line 282 "lex.ll" 2396 2397 { NUMERIC_RETURN(ONE); } // CFA 2397 2398 YY_BREAK 2398 2399 case 110: 2399 2400 YY_RULE_SETUP 2400 #line 28 0"lex.ll"2401 #line 283 "lex.ll" 2401 2402 { NUMERIC_RETURN(INTEGERconstant); } 2402 2403 YY_BREAK 2403 2404 case 111: 2404 2405 YY_RULE_SETUP 2405 #line 28 1"lex.ll"2406 #line 284 "lex.ll" 2406 2407 { NUMERIC_RETURN(INTEGERconstant); } 2407 2408 YY_BREAK 2408 2409 case 112: 2409 2410 YY_RULE_SETUP 2410 #line 28 2"lex.ll"2411 #line 285 "lex.ll" 2411 2412 { NUMERIC_RETURN(INTEGERconstant); } 2412 2413 YY_BREAK 2413 2414 case 113: 2414 2415 YY_RULE_SETUP 2415 #line 28 3"lex.ll"2416 #line 286 "lex.ll" 2416 2417 { NUMERIC_RETURN(FLOATINGconstant); } 2417 2418 YY_BREAK 2418 2419 case 114: 2419 2420 YY_RULE_SETUP 2420 #line 28 4"lex.ll"2421 #line 287 "lex.ll" 2421 2422 { NUMERIC_RETURN(FLOATINGconstant); } 2422 2423 YY_BREAK … … 2424 2425 case 115: 2425 2426 YY_RULE_SETUP 2426 #line 2 87"lex.ll"2427 #line 290 "lex.ll" 2427 2428 { BEGIN QUOTE; rm_underscore(); strtext = new std::string( yytext, yyleng ); } 2428 2429 YY_BREAK 2429 2430 case 116: 2430 2431 YY_RULE_SETUP 2431 #line 2 88"lex.ll"2432 #line 291 "lex.ll" 2432 2433 { strtext->append( yytext, yyleng ); } 2433 2434 YY_BREAK … … 2435 2436 /* rule 117 can match eol */ 2436 2437 YY_RULE_SETUP 2437 #line 2 89"lex.ll"2438 #line 292 "lex.ll" 2438 2439 { BEGIN 0; strtext->append( yytext, yyleng ); RETURN_STR(CHARACTERconstant); } 2439 2440 YY_BREAK … … 2442 2443 case 118: 2443 2444 YY_RULE_SETUP 2444 #line 29 3"lex.ll"2445 #line 296 "lex.ll" 2445 2446 { BEGIN STRING; rm_underscore(); strtext = new std::string( yytext, yyleng ); } 2446 2447 YY_BREAK 2447 2448 case 119: 2448 2449 YY_RULE_SETUP 2449 #line 29 4"lex.ll"2450 #line 297 "lex.ll" 2450 2451 { strtext->append( yytext, yyleng ); } 2451 2452 YY_BREAK … … 2453 2454 /* rule 120 can match eol */ 2454 2455 YY_RULE_SETUP 2455 #line 29 5"lex.ll"2456 #line 298 "lex.ll" 2456 2457 { BEGIN 0; strtext->append( yytext, yyleng ); RETURN_STR(STRINGliteral); } 2457 2458 YY_BREAK … … 2460 2461 case 121: 2461 2462 YY_RULE_SETUP 2462 #line 299"lex.ll"2463 #line 302 "lex.ll" 2463 2464 { rm_underscore(); strtext->append( yytext, yyleng ); } 2464 2465 YY_BREAK … … 2466 2467 /* rule 122 can match eol */ 2467 2468 YY_RULE_SETUP 2468 #line 30 0"lex.ll"2469 #line 303 "lex.ll" 2469 2470 {} // continuation (ALSO HANDLED BY CPP) 2470 2471 YY_BREAK 2471 2472 case 123: 2472 2473 YY_RULE_SETUP 2473 #line 30 1"lex.ll"2474 #line 304 "lex.ll" 2474 2475 { strtext->append( yytext, yyleng ); } // unknown escape character 2475 2476 YY_BREAK … … 2477 2478 case 124: 2478 2479 YY_RULE_SETUP 2479 #line 304 "lex.ll"2480 { ASCIIOP_RETURN(); }2481 YY_BREAK2482 case 125:2483 YY_RULE_SETUP2484 #line 305 "lex.ll"2485 { ASCIIOP_RETURN(); }2486 YY_BREAK2487 case 126:2488 YY_RULE_SETUP2489 #line 306 "lex.ll"2490 { ASCIIOP_RETURN(); }2491 YY_BREAK2492 case 127:2493 YY_RULE_SETUP2494 2480 #line 307 "lex.ll" 2495 2481 { ASCIIOP_RETURN(); } 2496 2482 YY_BREAK 2497 case 12 8:2483 case 125: 2498 2484 YY_RULE_SETUP 2499 2485 #line 308 "lex.ll" 2500 2486 { ASCIIOP_RETURN(); } 2501 2487 YY_BREAK 2502 case 12 9:2488 case 126: 2503 2489 YY_RULE_SETUP 2504 2490 #line 309 "lex.ll" 2505 2491 { ASCIIOP_RETURN(); } 2506 2492 YY_BREAK 2507 case 1 30:2493 case 127: 2508 2494 YY_RULE_SETUP 2509 2495 #line 310 "lex.ll" 2510 { ASCIIOP_RETURN(); } // also operator2511 YY_BREAK 2512 case 1 31:2496 { ASCIIOP_RETURN(); } 2497 YY_BREAK 2498 case 128: 2513 2499 YY_RULE_SETUP 2514 2500 #line 311 "lex.ll" 2515 2501 { ASCIIOP_RETURN(); } 2516 2502 YY_BREAK 2517 case 1 32:2503 case 129: 2518 2504 YY_RULE_SETUP 2519 2505 #line 312 "lex.ll" 2520 2506 { ASCIIOP_RETURN(); } 2521 2507 YY_BREAK 2522 case 13 3:2508 case 130: 2523 2509 YY_RULE_SETUP 2524 2510 #line 313 "lex.ll" 2525 2511 { ASCIIOP_RETURN(); } // also operator 2526 2512 YY_BREAK 2513 case 131: 2514 YY_RULE_SETUP 2515 #line 314 "lex.ll" 2516 { ASCIIOP_RETURN(); } 2517 YY_BREAK 2518 case 132: 2519 YY_RULE_SETUP 2520 #line 315 "lex.ll" 2521 { ASCIIOP_RETURN(); } 2522 YY_BREAK 2523 case 133: 2524 YY_RULE_SETUP 2525 #line 316 "lex.ll" 2526 { ASCIIOP_RETURN(); } // also operator 2527 YY_BREAK 2527 2528 case 134: 2528 2529 YY_RULE_SETUP 2529 #line 31 4"lex.ll"2530 #line 317 "lex.ll" 2530 2531 { NAMEDOP_RETURN(ELLIPSIS); } 2531 2532 YY_BREAK … … 2533 2534 case 135: 2534 2535 YY_RULE_SETUP 2535 #line 3 17"lex.ll"2536 #line 320 "lex.ll" 2536 2537 { RETURN_VAL('['); } 2537 2538 YY_BREAK 2538 2539 case 136: 2539 2540 YY_RULE_SETUP 2540 #line 3 18"lex.ll"2541 #line 321 "lex.ll" 2541 2542 { RETURN_VAL(']'); } 2542 2543 YY_BREAK 2543 2544 case 137: 2544 2545 YY_RULE_SETUP 2545 #line 3 19"lex.ll"2546 #line 322 "lex.ll" 2546 2547 { RETURN_VAL('{'); } 2547 2548 YY_BREAK 2548 2549 case 138: 2549 2550 YY_RULE_SETUP 2550 #line 32 0"lex.ll"2551 #line 323 "lex.ll" 2551 2552 { RETURN_VAL('}'); } 2552 2553 YY_BREAK … … 2554 2555 case 139: 2555 2556 YY_RULE_SETUP 2556 #line 323 "lex.ll"2557 { ASCIIOP_RETURN(); }2558 YY_BREAK2559 case 140:2560 YY_RULE_SETUP2561 #line 324 "lex.ll"2562 { ASCIIOP_RETURN(); }2563 YY_BREAK2564 case 141:2565 YY_RULE_SETUP2566 #line 325 "lex.ll"2567 { ASCIIOP_RETURN(); }2568 YY_BREAK2569 case 142:2570 YY_RULE_SETUP2571 2557 #line 326 "lex.ll" 2572 2558 { ASCIIOP_RETURN(); } 2573 2559 YY_BREAK 2574 case 14 3:2560 case 140: 2575 2561 YY_RULE_SETUP 2576 2562 #line 327 "lex.ll" 2577 2563 { ASCIIOP_RETURN(); } 2578 2564 YY_BREAK 2579 case 14 4:2565 case 141: 2580 2566 YY_RULE_SETUP 2581 2567 #line 328 "lex.ll" 2582 2568 { ASCIIOP_RETURN(); } 2583 2569 YY_BREAK 2584 case 14 5:2570 case 142: 2585 2571 YY_RULE_SETUP 2586 2572 #line 329 "lex.ll" 2587 2573 { ASCIIOP_RETURN(); } 2588 2574 YY_BREAK 2589 case 14 6:2575 case 143: 2590 2576 YY_RULE_SETUP 2591 2577 #line 330 "lex.ll" 2592 2578 { ASCIIOP_RETURN(); } 2593 2579 YY_BREAK 2594 case 14 7:2580 case 144: 2595 2581 YY_RULE_SETUP 2596 2582 #line 331 "lex.ll" 2597 2583 { ASCIIOP_RETURN(); } 2598 2584 YY_BREAK 2599 case 14 8:2585 case 145: 2600 2586 YY_RULE_SETUP 2601 2587 #line 332 "lex.ll" 2602 2588 { ASCIIOP_RETURN(); } 2603 2589 YY_BREAK 2604 case 14 9:2590 case 146: 2605 2591 YY_RULE_SETUP 2606 2592 #line 333 "lex.ll" 2607 2593 { ASCIIOP_RETURN(); } 2608 2594 YY_BREAK 2609 case 1 50:2595 case 147: 2610 2596 YY_RULE_SETUP 2611 2597 #line 334 "lex.ll" 2612 2598 { ASCIIOP_RETURN(); } 2613 2599 YY_BREAK 2614 case 1 51:2600 case 148: 2615 2601 YY_RULE_SETUP 2616 2602 #line 335 "lex.ll" 2617 2603 { ASCIIOP_RETURN(); } 2618 2604 YY_BREAK 2619 case 1 52:2605 case 149: 2620 2606 YY_RULE_SETUP 2621 2607 #line 336 "lex.ll" 2622 2608 { ASCIIOP_RETURN(); } 2623 2609 YY_BREAK 2610 case 150: 2611 YY_RULE_SETUP 2612 #line 337 "lex.ll" 2613 { ASCIIOP_RETURN(); } 2614 YY_BREAK 2615 case 151: 2616 YY_RULE_SETUP 2617 #line 338 "lex.ll" 2618 { ASCIIOP_RETURN(); } 2619 YY_BREAK 2620 case 152: 2621 YY_RULE_SETUP 2622 #line 339 "lex.ll" 2623 { ASCIIOP_RETURN(); } 2624 YY_BREAK 2624 2625 case 153: 2625 2626 YY_RULE_SETUP 2626 #line 3 38"lex.ll"2627 #line 341 "lex.ll" 2627 2628 { NAMEDOP_RETURN(ICR); } 2628 2629 YY_BREAK 2629 2630 case 154: 2630 2631 YY_RULE_SETUP 2631 #line 3 39"lex.ll"2632 #line 342 "lex.ll" 2632 2633 { NAMEDOP_RETURN(DECR); } 2633 2634 YY_BREAK 2634 2635 case 155: 2635 2636 YY_RULE_SETUP 2636 #line 34 0"lex.ll"2637 #line 343 "lex.ll" 2637 2638 { NAMEDOP_RETURN(EQ); } 2638 2639 YY_BREAK 2639 2640 case 156: 2640 2641 YY_RULE_SETUP 2641 #line 34 1"lex.ll"2642 #line 344 "lex.ll" 2642 2643 { NAMEDOP_RETURN(NE); } 2643 2644 YY_BREAK 2644 2645 case 157: 2645 2646 YY_RULE_SETUP 2646 #line 34 2"lex.ll"2647 #line 345 "lex.ll" 2647 2648 { NAMEDOP_RETURN(LS); } 2648 2649 YY_BREAK 2649 2650 case 158: 2650 2651 YY_RULE_SETUP 2651 #line 34 3"lex.ll"2652 #line 346 "lex.ll" 2652 2653 { NAMEDOP_RETURN(RS); } 2653 2654 YY_BREAK 2654 2655 case 159: 2655 2656 YY_RULE_SETUP 2656 #line 34 4"lex.ll"2657 #line 347 "lex.ll" 2657 2658 { NAMEDOP_RETURN(LE); } 2658 2659 YY_BREAK 2659 2660 case 160: 2660 2661 YY_RULE_SETUP 2661 #line 34 5"lex.ll"2662 #line 348 "lex.ll" 2662 2663 { NAMEDOP_RETURN(GE); } 2663 2664 YY_BREAK 2664 2665 case 161: 2665 2666 YY_RULE_SETUP 2666 #line 34 6"lex.ll"2667 #line 349 "lex.ll" 2667 2668 { NAMEDOP_RETURN(ANDAND); } 2668 2669 YY_BREAK 2669 2670 case 162: 2670 2671 YY_RULE_SETUP 2671 #line 3 47"lex.ll"2672 #line 350 "lex.ll" 2672 2673 { NAMEDOP_RETURN(OROR); } 2673 2674 YY_BREAK 2674 2675 case 163: 2675 2676 YY_RULE_SETUP 2676 #line 3 48"lex.ll"2677 #line 351 "lex.ll" 2677 2678 { NAMEDOP_RETURN(ARROW); } 2678 2679 YY_BREAK 2679 2680 case 164: 2680 2681 YY_RULE_SETUP 2681 #line 3 49"lex.ll"2682 #line 352 "lex.ll" 2682 2683 { NAMEDOP_RETURN(PLUSassign); } 2683 2684 YY_BREAK 2684 2685 case 165: 2685 2686 YY_RULE_SETUP 2686 #line 35 0"lex.ll"2687 #line 353 "lex.ll" 2687 2688 { NAMEDOP_RETURN(MINUSassign); } 2688 2689 YY_BREAK 2689 2690 case 166: 2690 2691 YY_RULE_SETUP 2691 #line 35 1"lex.ll"2692 #line 354 "lex.ll" 2692 2693 { NAMEDOP_RETURN(MULTassign); } 2693 2694 YY_BREAK 2694 2695 case 167: 2695 2696 YY_RULE_SETUP 2696 #line 35 2"lex.ll"2697 #line 355 "lex.ll" 2697 2698 { NAMEDOP_RETURN(DIVassign); } 2698 2699 YY_BREAK 2699 2700 case 168: 2700 2701 YY_RULE_SETUP 2701 #line 35 3"lex.ll"2702 #line 356 "lex.ll" 2702 2703 { NAMEDOP_RETURN(MODassign); } 2703 2704 YY_BREAK 2704 2705 case 169: 2705 2706 YY_RULE_SETUP 2706 #line 35 4"lex.ll"2707 #line 357 "lex.ll" 2707 2708 { NAMEDOP_RETURN(ANDassign); } 2708 2709 YY_BREAK 2709 2710 case 170: 2710 2711 YY_RULE_SETUP 2711 #line 35 5"lex.ll"2712 #line 358 "lex.ll" 2712 2713 { NAMEDOP_RETURN(ORassign); } 2713 2714 YY_BREAK 2714 2715 case 171: 2715 2716 YY_RULE_SETUP 2716 #line 35 6"lex.ll"2717 #line 359 "lex.ll" 2717 2718 { NAMEDOP_RETURN(ERassign); } 2718 2719 YY_BREAK 2719 2720 case 172: 2720 2721 YY_RULE_SETUP 2721 #line 3 57"lex.ll"2722 #line 360 "lex.ll" 2722 2723 { NAMEDOP_RETURN(LSassign); } 2723 2724 YY_BREAK 2724 2725 case 173: 2725 2726 YY_RULE_SETUP 2726 #line 3 58"lex.ll"2727 #line 361 "lex.ll" 2727 2728 { NAMEDOP_RETURN(RSassign); } 2728 2729 YY_BREAK 2729 2730 case 174: 2730 2731 YY_RULE_SETUP 2731 #line 36 0"lex.ll"2732 #line 363 "lex.ll" 2732 2733 { NAMEDOP_RETURN(ATassign); } // CFA 2733 2734 YY_BREAK … … 2735 2736 case 175: 2736 2737 YY_RULE_SETUP 2737 #line 36 3"lex.ll"2738 #line 366 "lex.ll" 2738 2739 { IDENTIFIER_RETURN(); } // unary 2739 2740 YY_BREAK 2740 2741 case 176: 2741 2742 YY_RULE_SETUP 2742 #line 36 4"lex.ll"2743 #line 367 "lex.ll" 2743 2744 { IDENTIFIER_RETURN(); } 2744 2745 YY_BREAK 2745 2746 case 177: 2746 2747 YY_RULE_SETUP 2747 #line 36 5"lex.ll"2748 #line 368 "lex.ll" 2748 2749 { IDENTIFIER_RETURN(); } 2749 2750 YY_BREAK 2750 2751 case 178: 2751 2752 YY_RULE_SETUP 2752 #line 36 6"lex.ll"2753 #line 369 "lex.ll" 2753 2754 { IDENTIFIER_RETURN(); } // binary 2754 2755 YY_BREAK … … 2781 2782 case 179: 2782 2783 YY_RULE_SETUP 2783 #line 39 3"lex.ll"2784 #line 396 "lex.ll" 2784 2785 { 2785 2786 // 1 or 2 character unary operator ? … … 2796 2797 case 180: 2797 2798 YY_RULE_SETUP 2798 #line 40 5"lex.ll"2799 #line 408 "lex.ll" 2799 2800 { printf("unknown character(s):\"%s\" on line %d\n", yytext, yylineno); } 2800 2801 YY_BREAK 2801 2802 case 181: 2802 2803 YY_RULE_SETUP 2803 #line 4 07"lex.ll"2804 #line 410 "lex.ll" 2804 2805 ECHO; 2805 2806 YY_BREAK 2806 #line 280 7"Parser/lex.cc"2807 #line 2808 "Parser/lex.cc" 2807 2808 case YY_STATE_EOF(INITIAL): 2808 2809 case YY_STATE_EOF(COMMENT): … … 3779 3780 #define YYTABLES_NAME "yytables" 3780 3781 3781 #line 4 07"lex.ll"3782 #line 410 "lex.ll" 3782 3783 3783 3784 -
src/Parser/lex.ll
ra1e67dd rf0121d7 10 10 * Created On : Sat Sep 22 08:58:10 2001 11 11 * Last Modified By : Peter A. Buhr 12 * Last Modified On : Tue Oct 18 22:19:37201613 * Update Count : 48 812 * Last Modified On : Wed Aug 24 13:27:04 2016 13 * Update Count : 487 14 14 */ 15 15 … … 71 71 // identifier, GCC: $ in identifier 72 72 identifier ([a-zA-Z_$]|{universal_char})([0-9a-zA-Z_$]|{universal_char})* 73 74 // quoted identifier 75 quoted_identifier "`"{identifier}"`" 73 76 74 77 // attribute identifier, GCC: $ in identifier -
src/Parser/parser.cc
ra1e67dd rf0121d7 1027 1027 357, 359, 361, 366, 367, 373, 377, 379, 381, 383, 1028 1028 385, 387, 389, 391, 393, 402, 403, 409, 410, 414, 1029 415, 419, 422, 424, 426, 428, 433, 43 6, 441, 444,1030 44 6, 448, 453, 466, 468, 470, 472, 474, 476, 478,1031 4 80, 482, 484, 486, 493, 494, 500, 501, 502, 503,1032 50 7, 508, 510, 515, 516, 518, 520, 525, 526, 528,1033 53 3, 534, 536, 541, 542, 544, 546, 548, 553, 554,1034 55 6, 561, 562, 567, 568, 573, 574, 579, 580, 585,1035 58 6, 591, 592, 595, 597, 602, 607, 608, 610, 616,1036 61 7, 621, 622, 623, 624, 625, 626, 627, 628, 629,1037 6 30, 631, 632, 638, 640, 642, 644, 649, 650, 655,1038 65 6, 662, 663, 669, 670, 671, 672, 673, 674, 675,1039 67 6, 677, 687, 694, 696, 706, 707, 712, 714, 720,1040 72 2, 726, 727, 732, 737, 740, 742, 744, 754, 756,1041 76 7, 768, 770, 774, 776, 780, 781, 786, 787, 791,1042 79 6, 797, 801, 803, 809, 810, 814, 816, 818, 820,1043 82 6, 827, 831, 833, 838, 840, 842, 847, 849, 854,1044 85 6, 860, 863, 867, 870, 874, 876, 878, 880, 885,1045 88 7, 889, 894, 896, 898, 900, 902, 907, 909, 911,1046 91 3, 918, 930, 931, 936, 938, 943, 947, 949, 951,1047 95 3, 955, 961, 962, 968, 969, 973, 974, 979, 981,1048 98 7, 988, 990, 995, 1000, 1010, 1012, 1016, 1017, 1022,1049 102 4, 1028, 1029, 1033, 1035, 1039, 1040, 1044, 1045, 1049,1050 10 50, 1065, 1066, 1067, 1068, 1069, 1073, 1078, 1085, 1095,1051 1 100, 1105, 1113, 1118, 1123, 1128, 1133, 1141, 1163, 1168,1052 117 5, 1177, 1184, 1189, 1194, 1205, 1210, 1215, 1220, 1225,1053 123 4, 1239, 1247, 1248, 1249, 1250, 1256, 1261, 1269, 1270,1054 127 1, 1272, 1276, 1277, 1278, 1279, 1284, 1285, 1294, 1295,1055 1 300, 1301, 1306, 1308, 1310, 1312, 1314, 1317, 1316, 1328,1056 132 9, 1331, 1341, 1342, 1347, 1349, 1351, 1353, 1355, 1358,1057 13 60, 1363, 1368, 1370, 1372, 1374, 1376, 1378, 1380, 1382,1058 138 4, 1386, 1388, 1390, 1392, 1398, 1399, 1401, 1403, 1405,1059 14 10, 1411, 1417, 1418, 1420, 1422, 1427, 1429, 1431, 1433,1060 143 8, 1439, 1441, 1443, 1448, 1449, 1451, 1456, 1457, 1459,1061 146 1, 1466, 1468, 1470, 1475, 1476, 1480, 1482, 1488, 1487,1062 149 1, 1493, 1498, 1500, 1506, 1507, 1512, 1513, 1515, 1516,1063 152 5, 1526, 1528, 1530, 1535, 1537, 1543, 1544, 1546, 1549,1064 155 2, 1557, 1558, 1563, 1568, 1572, 1574, 1580, 1579, 1586,1065 158 8, 1594, 1595, 1603, 1604, 1608, 1609, 1610, 1612, 1614,1066 162 1, 1622, 1624, 1626, 1631, 1632, 1638, 1639, 1643, 1644,1067 164 9, 1650, 1651, 1653, 1661, 1662, 1664, 1667, 1669, 1673,1068 167 4, 1675, 1677, 1679, 1683, 1688, 1696, 1697, 1706, 1708,1069 171 3, 1714, 1715, 1719, 1720, 1721, 1725, 1726, 1727, 1731,1070 173 2, 1733, 1738, 1739, 1740, 1741, 1747, 1748, 1750, 1755,1071 175 6, 1761, 1762, 1763, 1764, 1765, 1780, 1781, 1786, 1787,1072 179 3, 1795, 1798, 1800, 1802, 1825, 1826, 1828, 1830, 1835,1073 183 6, 1838, 1843, 1848, 1849, 1855, 1854, 1858, 1862, 1864,1074 186 6, 1872, 1873, 1878, 1883, 1885, 1890, 1892, 1893, 1895,1075 1 900, 1902, 1904, 1909, 1911, 1916, 1921, 1929, 1935, 1934,1076 194 8, 1949, 1954, 1955, 1959, 1964, 1969, 1977, 1982, 1993,1077 199 4, 1999, 2000, 2006, 2007, 2011, 2012, 2013, 2016, 2015,1078 202 6, 2035, 2041, 2047, 2056, 2062, 2068, 2074, 2080, 2088,1079 209 4, 2102, 2108, 2117, 2118, 2119, 2123, 2127, 2129, 2134,1080 213 5, 2139, 2140, 2145, 2151, 2152, 2155, 2157, 2158, 2162,1081 216 3, 2164, 2165, 2199, 2201, 2202, 2204, 2209, 2214, 2219,1082 222 1, 2223, 2228, 2230, 2232, 2234, 2239, 2241, 2250, 2252,1083 225 3, 2258, 2260, 2262, 2267, 2269, 2271, 2276, 2278, 2280,1084 228 9, 2290, 2291, 2295, 2297, 2299, 2304, 2306, 2308, 2313,1085 231 5, 2317, 2332, 2334, 2335, 2337, 2342, 2343, 2348, 2350,1086 235 2, 2357, 2359, 2361, 2363, 2368, 2370, 2372, 2382, 2384,1087 238 5, 2387, 2392, 2394, 2396, 2401, 2403, 2405, 2407, 2412,1088 241 4, 2416, 2447, 2449, 2450, 2452, 2457, 2462, 2470, 2472,1089 247 4, 2479, 2481, 2486, 2488, 2502, 2503, 2505, 2510, 2512,1090 251 4, 2516, 2518, 2523, 2524, 2526, 2528, 2533, 2535, 2537,1091 254 3, 2545, 2547, 2551, 2553, 2555, 2557, 2571, 2572, 2574,1092 257 9, 2581, 2583, 2585, 2587, 2592, 2593, 2595, 2597, 2602,1093 260 4, 2606, 2612, 2613, 2615, 2624, 2627, 2629, 2632, 2634,1094 263 6, 2649, 2650, 2652, 2657, 2659, 2661, 2663, 2665, 2670,1095 267 1, 2673, 2675, 2680, 2682, 2690, 2691, 2692, 2697, 2698,1096 270 2, 2704, 2706, 2708, 2710, 2712, 2719, 2721, 2723, 2725,1097 272 7, 2730, 2732, 2734, 2736, 2738, 2743, 2745, 2747, 2752,1098 277 8, 2779, 2781, 2785, 2786, 2790, 2792, 2794, 2796, 2798,1099 2 800, 2807, 2809, 2811, 2813, 2815, 2817, 2822, 2827, 2829,1100 28 31, 2849, 2851, 2856, 28571029 415, 419, 422, 424, 426, 428, 433, 435, 440, 443, 1030 445, 447, 452, 465, 467, 469, 471, 473, 475, 477, 1031 479, 481, 483, 485, 492, 493, 499, 500, 501, 502, 1032 506, 507, 509, 514, 515, 517, 519, 524, 525, 527, 1033 532, 533, 535, 540, 541, 543, 545, 547, 552, 553, 1034 555, 560, 561, 566, 567, 572, 573, 578, 579, 584, 1035 585, 590, 591, 594, 596, 601, 606, 607, 609, 615, 1036 616, 620, 621, 622, 623, 624, 625, 626, 627, 628, 1037 629, 630, 631, 637, 639, 641, 643, 648, 649, 654, 1038 655, 661, 662, 668, 669, 670, 671, 672, 673, 674, 1039 675, 676, 686, 693, 695, 705, 706, 711, 713, 719, 1040 721, 725, 726, 731, 736, 739, 741, 743, 753, 755, 1041 766, 767, 769, 773, 775, 779, 780, 785, 786, 790, 1042 795, 796, 800, 802, 808, 809, 813, 815, 817, 819, 1043 825, 826, 830, 832, 837, 839, 841, 846, 848, 853, 1044 855, 859, 862, 866, 869, 873, 875, 877, 879, 884, 1045 886, 888, 893, 895, 897, 899, 901, 906, 908, 910, 1046 912, 917, 929, 930, 935, 937, 942, 946, 948, 950, 1047 952, 954, 960, 961, 967, 968, 972, 973, 978, 980, 1048 986, 987, 989, 994, 999, 1009, 1011, 1015, 1016, 1021, 1049 1023, 1027, 1028, 1032, 1034, 1038, 1039, 1043, 1044, 1048, 1050 1049, 1064, 1065, 1066, 1067, 1068, 1072, 1077, 1084, 1094, 1051 1099, 1104, 1112, 1117, 1122, 1127, 1132, 1140, 1162, 1167, 1052 1174, 1176, 1183, 1188, 1193, 1204, 1209, 1214, 1219, 1224, 1053 1233, 1238, 1246, 1247, 1248, 1249, 1255, 1260, 1268, 1269, 1054 1270, 1271, 1275, 1276, 1277, 1278, 1283, 1284, 1293, 1294, 1055 1299, 1300, 1305, 1307, 1309, 1311, 1313, 1316, 1315, 1327, 1056 1328, 1330, 1340, 1341, 1346, 1348, 1350, 1352, 1354, 1357, 1057 1359, 1362, 1367, 1369, 1371, 1373, 1375, 1377, 1379, 1381, 1058 1383, 1385, 1387, 1389, 1391, 1397, 1398, 1400, 1402, 1404, 1059 1409, 1410, 1416, 1417, 1419, 1421, 1426, 1428, 1430, 1432, 1060 1437, 1438, 1440, 1442, 1447, 1448, 1450, 1455, 1456, 1458, 1061 1460, 1465, 1467, 1469, 1474, 1475, 1479, 1481, 1487, 1486, 1062 1490, 1492, 1497, 1499, 1505, 1506, 1511, 1512, 1514, 1515, 1063 1524, 1525, 1527, 1529, 1534, 1536, 1542, 1543, 1545, 1548, 1064 1551, 1556, 1557, 1562, 1567, 1571, 1573, 1579, 1578, 1585, 1065 1587, 1593, 1594, 1602, 1603, 1607, 1608, 1609, 1611, 1613, 1066 1620, 1621, 1623, 1625, 1630, 1631, 1637, 1638, 1642, 1643, 1067 1648, 1649, 1650, 1652, 1660, 1661, 1663, 1666, 1668, 1672, 1068 1673, 1674, 1676, 1678, 1682, 1687, 1695, 1696, 1705, 1707, 1069 1712, 1713, 1714, 1718, 1719, 1720, 1724, 1725, 1726, 1730, 1070 1731, 1732, 1737, 1738, 1739, 1740, 1746, 1747, 1749, 1754, 1071 1755, 1760, 1761, 1762, 1763, 1764, 1779, 1780, 1785, 1786, 1072 1792, 1794, 1797, 1799, 1801, 1824, 1825, 1827, 1829, 1834, 1073 1835, 1837, 1842, 1847, 1848, 1854, 1853, 1857, 1861, 1863, 1074 1865, 1871, 1872, 1877, 1882, 1884, 1889, 1891, 1892, 1894, 1075 1899, 1901, 1903, 1908, 1910, 1915, 1920, 1928, 1934, 1933, 1076 1947, 1948, 1953, 1954, 1958, 1963, 1968, 1976, 1981, 1992, 1077 1993, 1998, 1999, 2005, 2006, 2010, 2011, 2012, 2015, 2014, 1078 2025, 2034, 2040, 2046, 2055, 2061, 2067, 2073, 2079, 2087, 1079 2093, 2101, 2107, 2116, 2117, 2118, 2122, 2126, 2128, 2133, 1080 2134, 2138, 2139, 2144, 2150, 2151, 2154, 2156, 2157, 2161, 1081 2162, 2163, 2164, 2198, 2200, 2201, 2203, 2208, 2213, 2218, 1082 2220, 2222, 2227, 2229, 2231, 2233, 2238, 2240, 2249, 2251, 1083 2252, 2257, 2259, 2261, 2266, 2268, 2270, 2275, 2277, 2279, 1084 2288, 2289, 2290, 2294, 2296, 2298, 2303, 2305, 2307, 2312, 1085 2314, 2316, 2331, 2333, 2334, 2336, 2341, 2342, 2347, 2349, 1086 2351, 2356, 2358, 2360, 2362, 2367, 2369, 2371, 2381, 2383, 1087 2384, 2386, 2391, 2393, 2395, 2400, 2402, 2404, 2406, 2411, 1088 2413, 2415, 2446, 2448, 2449, 2451, 2456, 2461, 2469, 2471, 1089 2473, 2478, 2480, 2485, 2487, 2501, 2502, 2504, 2509, 2511, 1090 2513, 2515, 2517, 2522, 2523, 2525, 2527, 2532, 2534, 2536, 1091 2542, 2544, 2546, 2550, 2552, 2554, 2556, 2570, 2571, 2573, 1092 2578, 2580, 2582, 2584, 2586, 2591, 2592, 2594, 2596, 2601, 1093 2603, 2605, 2611, 2612, 2614, 2623, 2626, 2628, 2631, 2633, 1094 2635, 2648, 2649, 2651, 2656, 2658, 2660, 2662, 2664, 2669, 1095 2670, 2672, 2674, 2679, 2681, 2689, 2690, 2691, 2696, 2697, 1096 2701, 2703, 2705, 2707, 2709, 2711, 2718, 2720, 2722, 2724, 1097 2726, 2728, 2730, 2732, 2734, 2736, 2741, 2743, 2745, 2750, 1098 2776, 2777, 2779, 2783, 2784, 2788, 2790, 2792, 2794, 2796, 1099 2798, 2805, 2807, 2809, 2811, 2813, 2815, 2820, 2825, 2827, 1100 2829, 2847, 2849, 2854, 2855 1101 1101 }; 1102 1102 #endif … … 5202 5202 5203 5203 /* Line 1806 of yacc.c */ 5204 #line 43 7"parser.yy"5204 #line 436 "parser.yy" 5205 5205 { (yyval.en) = new ExpressionNode( build_constantInteger( *(yyvsp[(1) - (1)].tok) ) ); } 5206 5206 break; … … 5209 5209 5210 5210 /* Line 1806 of yacc.c */ 5211 #line 44 5"parser.yy"5211 #line 444 "parser.yy" 5212 5212 { (yyval.en) = (yyvsp[(1) - (1)].en); } 5213 5213 break; … … 5216 5216 5217 5217 /* Line 1806 of yacc.c */ 5218 #line 44 7"parser.yy"5218 #line 446 "parser.yy" 5219 5219 { (yyval.en) = new ExpressionNode( (yyvsp[(1) - (1)].constant) ); } 5220 5220 break; … … 5223 5223 5224 5224 /* Line 1806 of yacc.c */ 5225 #line 44 9"parser.yy"5225 #line 448 "parser.yy" 5226 5226 { (yyval.en) = (yyvsp[(2) - (2)].en)->set_extension( true ); } 5227 5227 break; … … 5230 5230 5231 5231 /* Line 1806 of yacc.c */ 5232 #line 45 4"parser.yy"5232 #line 453 "parser.yy" 5233 5233 { 5234 5234 switch ( (yyvsp[(1) - (2)].op) ) { … … 5248 5248 5249 5249 /* Line 1806 of yacc.c */ 5250 #line 46 7"parser.yy"5250 #line 466 "parser.yy" 5251 5251 { (yyval.en) = new ExpressionNode( build_unary_val( (yyvsp[(1) - (2)].op), (yyvsp[(2) - (2)].en) ) ); } 5252 5252 break; … … 5255 5255 5256 5256 /* Line 1806 of yacc.c */ 5257 #line 46 9"parser.yy"5257 #line 468 "parser.yy" 5258 5258 { (yyval.en) = new ExpressionNode( build_unary_ptr( OperKinds::Incr, (yyvsp[(2) - (2)].en) ) ); } 5259 5259 break; … … 5262 5262 5263 5263 /* Line 1806 of yacc.c */ 5264 #line 47 1"parser.yy"5264 #line 470 "parser.yy" 5265 5265 { (yyval.en) = new ExpressionNode( build_unary_ptr( OperKinds::Decr, (yyvsp[(2) - (2)].en) ) ); } 5266 5266 break; … … 5269 5269 5270 5270 /* Line 1806 of yacc.c */ 5271 #line 47 3"parser.yy"5271 #line 472 "parser.yy" 5272 5272 { (yyval.en) = new ExpressionNode( build_sizeOfexpr( (yyvsp[(2) - (2)].en) ) ); } 5273 5273 break; … … 5276 5276 5277 5277 /* Line 1806 of yacc.c */ 5278 #line 47 5"parser.yy"5278 #line 474 "parser.yy" 5279 5279 { (yyval.en) = new ExpressionNode( build_sizeOftype( (yyvsp[(3) - (4)].decl) ) ); } 5280 5280 break; … … 5283 5283 5284 5284 /* Line 1806 of yacc.c */ 5285 #line 47 7"parser.yy"5285 #line 476 "parser.yy" 5286 5286 { (yyval.en) = new ExpressionNode( build_alignOfexpr( (yyvsp[(2) - (2)].en) ) ); } 5287 5287 break; … … 5290 5290 5291 5291 /* Line 1806 of yacc.c */ 5292 #line 47 9"parser.yy"5292 #line 478 "parser.yy" 5293 5293 { (yyval.en) = new ExpressionNode( build_alignOftype( (yyvsp[(3) - (4)].decl) ) ); } 5294 5294 break; … … 5297 5297 5298 5298 /* Line 1806 of yacc.c */ 5299 #line 48 1"parser.yy"5299 #line 480 "parser.yy" 5300 5300 { (yyval.en) = new ExpressionNode( build_offsetOf( (yyvsp[(3) - (6)].decl), build_varref( (yyvsp[(5) - (6)].tok) ) ) ); } 5301 5301 break; … … 5304 5304 5305 5305 /* Line 1806 of yacc.c */ 5306 #line 48 3"parser.yy"5306 #line 482 "parser.yy" 5307 5307 { (yyval.en) = new ExpressionNode( build_attrexpr( build_varref( (yyvsp[(1) - (1)].tok) ), nullptr ) ); } 5308 5308 break; … … 5311 5311 5312 5312 /* Line 1806 of yacc.c */ 5313 #line 48 5"parser.yy"5313 #line 484 "parser.yy" 5314 5314 { (yyval.en) = new ExpressionNode( build_attrexpr( build_varref( (yyvsp[(1) - (4)].tok) ), (yyvsp[(3) - (4)].en) ) ); } 5315 5315 break; … … 5318 5318 5319 5319 /* Line 1806 of yacc.c */ 5320 #line 48 7"parser.yy"5320 #line 486 "parser.yy" 5321 5321 { (yyval.en) = new ExpressionNode( build_attrtype( build_varref( (yyvsp[(1) - (4)].tok) ), (yyvsp[(3) - (4)].decl) ) ); } 5322 5322 break; … … 5325 5325 5326 5326 /* Line 1806 of yacc.c */ 5327 #line 492 "parser.yy" 5328 { (yyval.op) = OperKinds::PointTo; } 5329 break; 5330 5331 case 65: 5332 5333 /* Line 1806 of yacc.c */ 5327 5334 #line 493 "parser.yy" 5328 { (yyval.op) = OperKinds::PointTo; }5329 break;5330 5331 case 65:5332 5333 /* Line 1806 of yacc.c */5334 #line 494 "parser.yy"5335 5335 { (yyval.op) = OperKinds::AddressOf; } 5336 5336 break; … … 5339 5339 5340 5340 /* Line 1806 of yacc.c */ 5341 #line 499 "parser.yy" 5342 { (yyval.op) = OperKinds::UnPlus; } 5343 break; 5344 5345 case 67: 5346 5347 /* Line 1806 of yacc.c */ 5341 5348 #line 500 "parser.yy" 5342 { (yyval.op) = OperKinds::Un Plus; }5343 break; 5344 5345 case 6 7:5349 { (yyval.op) = OperKinds::UnMinus; } 5350 break; 5351 5352 case 68: 5346 5353 5347 5354 /* Line 1806 of yacc.c */ 5348 5355 #line 501 "parser.yy" 5349 { (yyval.op) = OperKinds:: UnMinus; }5350 break; 5351 5352 case 6 8:5356 { (yyval.op) = OperKinds::Neg; } 5357 break; 5358 5359 case 69: 5353 5360 5354 5361 /* Line 1806 of yacc.c */ 5355 5362 #line 502 "parser.yy" 5356 { (yyval.op) = OperKinds::Neg; }5357 break;5358 5359 case 69:5360 5361 /* Line 1806 of yacc.c */5362 #line 503 "parser.yy"5363 5363 { (yyval.op) = OperKinds::BitNeg; } 5364 5364 break; … … 5367 5367 5368 5368 /* Line 1806 of yacc.c */ 5369 #line 50 9"parser.yy"5369 #line 508 "parser.yy" 5370 5370 { (yyval.en) = new ExpressionNode( build_cast( (yyvsp[(2) - (4)].decl), (yyvsp[(4) - (4)].en) ) ); } 5371 5371 break; … … 5374 5374 5375 5375 /* Line 1806 of yacc.c */ 5376 #line 51 1"parser.yy"5376 #line 510 "parser.yy" 5377 5377 { (yyval.en) = new ExpressionNode( build_cast( (yyvsp[(2) - (4)].decl), (yyvsp[(4) - (4)].en) ) ); } 5378 5378 break; … … 5381 5381 5382 5382 /* Line 1806 of yacc.c */ 5383 #line 51 7"parser.yy"5383 #line 516 "parser.yy" 5384 5384 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Mul, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5385 5385 break; … … 5388 5388 5389 5389 /* Line 1806 of yacc.c */ 5390 #line 51 9"parser.yy"5390 #line 518 "parser.yy" 5391 5391 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Div, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5392 5392 break; … … 5395 5395 5396 5396 /* Line 1806 of yacc.c */ 5397 #line 52 1"parser.yy"5397 #line 520 "parser.yy" 5398 5398 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Mod, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5399 5399 break; … … 5402 5402 5403 5403 /* Line 1806 of yacc.c */ 5404 #line 52 7"parser.yy"5404 #line 526 "parser.yy" 5405 5405 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Plus, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5406 5406 break; … … 5409 5409 5410 5410 /* Line 1806 of yacc.c */ 5411 #line 52 9"parser.yy"5411 #line 528 "parser.yy" 5412 5412 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Minus, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5413 5413 break; … … 5416 5416 5417 5417 /* Line 1806 of yacc.c */ 5418 #line 53 5"parser.yy"5418 #line 534 "parser.yy" 5419 5419 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::LShift, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5420 5420 break; … … 5423 5423 5424 5424 /* Line 1806 of yacc.c */ 5425 #line 53 7"parser.yy"5425 #line 536 "parser.yy" 5426 5426 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::RShift, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5427 5427 break; … … 5430 5430 5431 5431 /* Line 1806 of yacc.c */ 5432 #line 54 3"parser.yy"5432 #line 542 "parser.yy" 5433 5433 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::LThan, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5434 5434 break; … … 5437 5437 5438 5438 /* Line 1806 of yacc.c */ 5439 #line 54 5"parser.yy"5439 #line 544 "parser.yy" 5440 5440 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::GThan, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5441 5441 break; … … 5444 5444 5445 5445 /* Line 1806 of yacc.c */ 5446 #line 54 7"parser.yy"5446 #line 546 "parser.yy" 5447 5447 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::LEThan, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5448 5448 break; … … 5451 5451 5452 5452 /* Line 1806 of yacc.c */ 5453 #line 54 9"parser.yy"5453 #line 548 "parser.yy" 5454 5454 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::GEThan, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5455 5455 break; … … 5458 5458 5459 5459 /* Line 1806 of yacc.c */ 5460 #line 55 5"parser.yy"5460 #line 554 "parser.yy" 5461 5461 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Eq, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5462 5462 break; … … 5465 5465 5466 5466 /* Line 1806 of yacc.c */ 5467 #line 55 7"parser.yy"5467 #line 556 "parser.yy" 5468 5468 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Neq, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5469 5469 break; … … 5472 5472 5473 5473 /* Line 1806 of yacc.c */ 5474 #line 56 3"parser.yy"5474 #line 562 "parser.yy" 5475 5475 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::BitAnd, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5476 5476 break; … … 5479 5479 5480 5480 /* Line 1806 of yacc.c */ 5481 #line 56 9"parser.yy"5481 #line 568 "parser.yy" 5482 5482 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Xor, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5483 5483 break; … … 5486 5486 5487 5487 /* Line 1806 of yacc.c */ 5488 #line 57 5"parser.yy"5488 #line 574 "parser.yy" 5489 5489 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::BitOr, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5490 5490 break; … … 5493 5493 5494 5494 /* Line 1806 of yacc.c */ 5495 #line 58 1"parser.yy"5495 #line 580 "parser.yy" 5496 5496 { (yyval.en) = new ExpressionNode( build_and_or( (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en), true ) ); } 5497 5497 break; … … 5500 5500 5501 5501 /* Line 1806 of yacc.c */ 5502 #line 58 7"parser.yy"5502 #line 586 "parser.yy" 5503 5503 { (yyval.en) = new ExpressionNode( build_and_or( (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en), false ) ); } 5504 5504 break; … … 5507 5507 5508 5508 /* Line 1806 of yacc.c */ 5509 #line 59 3"parser.yy"5509 #line 592 "parser.yy" 5510 5510 { (yyval.en) = new ExpressionNode( build_cond( (yyvsp[(1) - (5)].en), (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].en) ) ); } 5511 5511 break; … … 5514 5514 5515 5515 /* Line 1806 of yacc.c */ 5516 #line 59 6"parser.yy"5516 #line 595 "parser.yy" 5517 5517 { (yyval.en) = new ExpressionNode( build_cond( (yyvsp[(1) - (4)].en), (yyvsp[(1) - (4)].en), (yyvsp[(4) - (4)].en) ) ); } 5518 5518 break; … … 5521 5521 5522 5522 /* Line 1806 of yacc.c */ 5523 #line 59 8"parser.yy"5523 #line 597 "parser.yy" 5524 5524 { (yyval.en) = new ExpressionNode( build_cond( (yyvsp[(1) - (5)].en), (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].en) ) ); } 5525 5525 break; … … 5528 5528 5529 5529 /* Line 1806 of yacc.c */ 5530 #line 60 9"parser.yy"5530 #line 608 "parser.yy" 5531 5531 { (yyval.en) = new ExpressionNode( build_binary_ptr( (yyvsp[(2) - (3)].op), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5532 5532 break; … … 5535 5535 5536 5536 /* Line 1806 of yacc.c */ 5537 #line 61 1"parser.yy"5537 #line 610 "parser.yy" 5538 5538 { (yyval.en) = ( (yyvsp[(2) - (2)].en) == 0 ) ? (yyvsp[(1) - (2)].en) : new ExpressionNode( build_binary_ptr( OperKinds::Assign, (yyvsp[(1) - (2)].en), (yyvsp[(2) - (2)].en) ) ); } 5539 5539 break; … … 5542 5542 5543 5543 /* Line 1806 of yacc.c */ 5544 #line 61 6"parser.yy"5544 #line 615 "parser.yy" 5545 5545 { (yyval.en) = nullptr; } 5546 5546 break; … … 5549 5549 5550 5550 /* Line 1806 of yacc.c */ 5551 #line 620 "parser.yy" 5552 { (yyval.op) = OperKinds::Assign; } 5553 break; 5554 5555 case 112: 5556 5557 /* Line 1806 of yacc.c */ 5551 5558 #line 621 "parser.yy" 5552 { (yyval.op) = OperKinds::A ssign; }5553 break; 5554 5555 case 11 2:5559 { (yyval.op) = OperKinds::AtAssn; } 5560 break; 5561 5562 case 113: 5556 5563 5557 5564 /* Line 1806 of yacc.c */ 5558 5565 #line 622 "parser.yy" 5559 { (yyval.op) = OperKinds:: AtAssn; }5560 break; 5561 5562 case 11 3:5566 { (yyval.op) = OperKinds::MulAssn; } 5567 break; 5568 5569 case 114: 5563 5570 5564 5571 /* Line 1806 of yacc.c */ 5565 5572 #line 623 "parser.yy" 5566 { (yyval.op) = OperKinds:: MulAssn; }5567 break; 5568 5569 case 11 4:5573 { (yyval.op) = OperKinds::DivAssn; } 5574 break; 5575 5576 case 115: 5570 5577 5571 5578 /* Line 1806 of yacc.c */ 5572 5579 #line 624 "parser.yy" 5573 { (yyval.op) = OperKinds:: DivAssn; }5574 break; 5575 5576 case 11 5:5580 { (yyval.op) = OperKinds::ModAssn; } 5581 break; 5582 5583 case 116: 5577 5584 5578 5585 /* Line 1806 of yacc.c */ 5579 5586 #line 625 "parser.yy" 5580 { (yyval.op) = OperKinds:: ModAssn; }5581 break; 5582 5583 case 11 6:5587 { (yyval.op) = OperKinds::PlusAssn; } 5588 break; 5589 5590 case 117: 5584 5591 5585 5592 /* Line 1806 of yacc.c */ 5586 5593 #line 626 "parser.yy" 5587 { (yyval.op) = OperKinds:: PlusAssn; }5588 break; 5589 5590 case 11 7:5594 { (yyval.op) = OperKinds::MinusAssn; } 5595 break; 5596 5597 case 118: 5591 5598 5592 5599 /* Line 1806 of yacc.c */ 5593 5600 #line 627 "parser.yy" 5594 { (yyval.op) = OperKinds:: MinusAssn; }5595 break; 5596 5597 case 11 8:5601 { (yyval.op) = OperKinds::LSAssn; } 5602 break; 5603 5604 case 119: 5598 5605 5599 5606 /* Line 1806 of yacc.c */ 5600 5607 #line 628 "parser.yy" 5601 { (yyval.op) = OperKinds:: LSAssn; }5602 break; 5603 5604 case 1 19:5608 { (yyval.op) = OperKinds::RSAssn; } 5609 break; 5610 5611 case 120: 5605 5612 5606 5613 /* Line 1806 of yacc.c */ 5607 5614 #line 629 "parser.yy" 5608 { (yyval.op) = OperKinds:: RSAssn; }5609 break; 5610 5611 case 12 0:5615 { (yyval.op) = OperKinds::AndAssn; } 5616 break; 5617 5618 case 121: 5612 5619 5613 5620 /* Line 1806 of yacc.c */ 5614 5621 #line 630 "parser.yy" 5615 { (yyval.op) = OperKinds:: AndAssn; }5616 break; 5617 5618 case 12 1:5622 { (yyval.op) = OperKinds::ERAssn; } 5623 break; 5624 5625 case 122: 5619 5626 5620 5627 /* Line 1806 of yacc.c */ 5621 5628 #line 631 "parser.yy" 5622 { (yyval.op) = OperKinds::ERAssn; }5623 break;5624 5625 case 122:5626 5627 /* Line 1806 of yacc.c */5628 #line 632 "parser.yy"5629 5629 { (yyval.op) = OperKinds::OrAssn; } 5630 5630 break; … … 5633 5633 5634 5634 /* Line 1806 of yacc.c */ 5635 #line 63 9"parser.yy"5635 #line 638 "parser.yy" 5636 5636 { (yyval.en) = new ExpressionNode( build_tuple() ); } 5637 5637 break; … … 5640 5640 5641 5641 /* Line 1806 of yacc.c */ 5642 #line 64 1"parser.yy"5642 #line 640 "parser.yy" 5643 5643 { (yyval.en) = new ExpressionNode( build_tuple( (yyvsp[(3) - (5)].en) ) ); } 5644 5644 break; … … 5647 5647 5648 5648 /* Line 1806 of yacc.c */ 5649 #line 64 3"parser.yy"5649 #line 642 "parser.yy" 5650 5650 { (yyval.en) = new ExpressionNode( build_tuple( (ExpressionNode *)(new ExpressionNode( nullptr ) )->set_last( (yyvsp[(4) - (6)].en) ) ) ); } 5651 5651 break; … … 5654 5654 5655 5655 /* Line 1806 of yacc.c */ 5656 #line 64 5"parser.yy"5656 #line 644 "parser.yy" 5657 5657 { (yyval.en) = new ExpressionNode( build_tuple( (ExpressionNode *)(yyvsp[(3) - (7)].en)->set_last( (yyvsp[(5) - (7)].en) ) ) ); } 5658 5658 break; … … 5661 5661 5662 5662 /* Line 1806 of yacc.c */ 5663 #line 65 1"parser.yy"5663 #line 650 "parser.yy" 5664 5664 { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_last( (yyvsp[(3) - (3)].en) ); } 5665 5665 break; … … 5668 5668 5669 5669 /* Line 1806 of yacc.c */ 5670 #line 65 7"parser.yy"5670 #line 656 "parser.yy" 5671 5671 { (yyval.en) = new ExpressionNode( build_comma( (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5672 5672 break; … … 5675 5675 5676 5676 /* Line 1806 of yacc.c */ 5677 #line 66 2"parser.yy"5677 #line 661 "parser.yy" 5678 5678 { (yyval.en) = 0; } 5679 5679 break; … … 5682 5682 5683 5683 /* Line 1806 of yacc.c */ 5684 #line 67 1"parser.yy"5684 #line 670 "parser.yy" 5685 5685 { (yyval.sn) = (yyvsp[(1) - (1)].sn); } 5686 5686 break; … … 5689 5689 5690 5690 /* Line 1806 of yacc.c */ 5691 #line 67 8"parser.yy"5691 #line 677 "parser.yy" 5692 5692 { 5693 5693 Token fn; … … 5700 5700 5701 5701 /* Line 1806 of yacc.c */ 5702 #line 68 8"parser.yy"5702 #line 687 "parser.yy" 5703 5703 { 5704 5704 (yyval.sn) = (yyvsp[(4) - (4)].sn)->add_label( (yyvsp[(1) - (4)].tok) ); … … 5709 5709 5710 5710 /* Line 1806 of yacc.c */ 5711 #line 69 5"parser.yy"5711 #line 694 "parser.yy" 5712 5712 { (yyval.sn) = new StatementNode( build_compound( (StatementNode *)0 ) ); } 5713 5713 break; … … 5716 5716 5717 5717 /* Line 1806 of yacc.c */ 5718 #line 70 2"parser.yy"5718 #line 701 "parser.yy" 5719 5719 { (yyval.sn) = new StatementNode( build_compound( (yyvsp[(5) - (7)].sn) ) ); } 5720 5720 break; … … 5723 5723 5724 5724 /* Line 1806 of yacc.c */ 5725 #line 70 8"parser.yy"5725 #line 707 "parser.yy" 5726 5726 { if ( (yyvsp[(1) - (3)].sn) != 0 ) { (yyvsp[(1) - (3)].sn)->set_last( (yyvsp[(3) - (3)].sn) ); (yyval.sn) = (yyvsp[(1) - (3)].sn); } } 5727 5727 break; … … 5730 5730 5731 5731 /* Line 1806 of yacc.c */ 5732 #line 71 3"parser.yy"5732 #line 712 "parser.yy" 5733 5733 { (yyval.sn) = new StatementNode( (yyvsp[(1) - (1)].decl) ); } 5734 5734 break; … … 5737 5737 5738 5738 /* Line 1806 of yacc.c */ 5739 #line 71 5"parser.yy"5739 #line 714 "parser.yy" 5740 5740 { // mark all fields in list 5741 5741 for ( DeclarationNode *iter = (yyvsp[(2) - (2)].decl); iter != nullptr; iter = (DeclarationNode *)iter->get_next() ) … … 5748 5748 5749 5749 /* Line 1806 of yacc.c */ 5750 #line 72 1"parser.yy"5750 #line 720 "parser.yy" 5751 5751 { (yyval.sn) = new StatementNode( (yyvsp[(1) - (1)].decl) ); } 5752 5752 break; … … 5755 5755 5756 5756 /* Line 1806 of yacc.c */ 5757 #line 72 8"parser.yy"5757 #line 727 "parser.yy" 5758 5758 { if ( (yyvsp[(1) - (2)].sn) != 0 ) { (yyvsp[(1) - (2)].sn)->set_last( (yyvsp[(2) - (2)].sn) ); (yyval.sn) = (yyvsp[(1) - (2)].sn); } } 5759 5759 break; … … 5762 5762 5763 5763 /* Line 1806 of yacc.c */ 5764 #line 73 3"parser.yy"5764 #line 732 "parser.yy" 5765 5765 { (yyval.sn) = new StatementNode( build_expr( (yyvsp[(1) - (2)].en) ) ); } 5766 5766 break; … … 5769 5769 5770 5770 /* Line 1806 of yacc.c */ 5771 #line 73 9"parser.yy"5771 #line 738 "parser.yy" 5772 5772 { (yyval.sn) = new StatementNode( build_if( (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn), nullptr ) ); } 5773 5773 break; … … 5776 5776 5777 5777 /* Line 1806 of yacc.c */ 5778 #line 74 1"parser.yy"5778 #line 740 "parser.yy" 5779 5779 { (yyval.sn) = new StatementNode( build_if( (yyvsp[(3) - (7)].en), (yyvsp[(5) - (7)].sn), (yyvsp[(7) - (7)].sn) ) ); } 5780 5780 break; … … 5783 5783 5784 5784 /* Line 1806 of yacc.c */ 5785 #line 74 3"parser.yy"5785 #line 742 "parser.yy" 5786 5786 { (yyval.sn) = new StatementNode( build_switch( (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ) ); } 5787 5787 break; … … 5790 5790 5791 5791 /* Line 1806 of yacc.c */ 5792 #line 74 5"parser.yy"5792 #line 744 "parser.yy" 5793 5793 { 5794 5794 StatementNode *sw = new StatementNode( build_switch( (yyvsp[(3) - (9)].en), (yyvsp[(8) - (9)].sn) ) ); … … 5805 5805 5806 5806 /* Line 1806 of yacc.c */ 5807 #line 75 5"parser.yy"5807 #line 754 "parser.yy" 5808 5808 { (yyval.sn) = new StatementNode( build_switch( (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ) ); } 5809 5809 break; … … 5812 5812 5813 5813 /* Line 1806 of yacc.c */ 5814 #line 75 7"parser.yy"5814 #line 756 "parser.yy" 5815 5815 { 5816 5816 StatementNode *sw = new StatementNode( build_switch( (yyvsp[(3) - (9)].en), (yyvsp[(8) - (9)].sn) ) ); … … 5822 5822 5823 5823 /* Line 1806 of yacc.c */ 5824 #line 76 7"parser.yy"5824 #line 766 "parser.yy" 5825 5825 { (yyval.en) = (yyvsp[(1) - (1)].en); } 5826 5826 break; … … 5829 5829 5830 5830 /* Line 1806 of yacc.c */ 5831 #line 76 9"parser.yy"5831 #line 768 "parser.yy" 5832 5832 { (yyval.en) = new ExpressionNode( build_range( (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5833 5833 break; … … 5836 5836 5837 5837 /* Line 1806 of yacc.c */ 5838 #line 77 4"parser.yy"5838 #line 773 "parser.yy" 5839 5839 { (yyval.sn) = new StatementNode( build_case( (yyvsp[(1) - (1)].en) ) ); } 5840 5840 break; … … 5843 5843 5844 5844 /* Line 1806 of yacc.c */ 5845 #line 77 6"parser.yy"5845 #line 775 "parser.yy" 5846 5846 { (yyval.sn) = (StatementNode *)((yyvsp[(1) - (3)].sn)->set_last( new StatementNode( build_case( (yyvsp[(3) - (3)].en) ) ) ) ); } 5847 5847 break; … … 5850 5850 5851 5851 /* Line 1806 of yacc.c */ 5852 #line 779 "parser.yy" 5853 { (yyval.sn) = (yyvsp[(2) - (3)].sn); } 5854 break; 5855 5856 case 166: 5857 5858 /* Line 1806 of yacc.c */ 5852 5859 #line 780 "parser.yy" 5853 { (yyval.sn) = (yyvsp[(2) - (3)].sn); }5854 break;5855 5856 case 166:5857 5858 /* Line 1806 of yacc.c */5859 #line 781 "parser.yy"5860 5860 { (yyval.sn) = new StatementNode( build_default() ); } 5861 5861 break; … … 5864 5864 5865 5865 /* Line 1806 of yacc.c */ 5866 #line 78 7"parser.yy"5866 #line 786 "parser.yy" 5867 5867 { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (2)].sn)->set_last( (yyvsp[(2) - (2)].sn) )); } 5868 5868 break; … … 5871 5871 5872 5872 /* Line 1806 of yacc.c */ 5873 #line 79 1"parser.yy"5873 #line 790 "parser.yy" 5874 5874 { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( new StatementNode( build_compound( (yyvsp[(2) - (2)].sn) ) ) ); } 5875 5875 break; … … 5878 5878 5879 5879 /* Line 1806 of yacc.c */ 5880 #line 79 6"parser.yy"5880 #line 795 "parser.yy" 5881 5881 { (yyval.sn) = 0; } 5882 5882 break; … … 5885 5885 5886 5886 /* Line 1806 of yacc.c */ 5887 #line 80 2"parser.yy"5887 #line 801 "parser.yy" 5888 5888 { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( new StatementNode( build_compound( (yyvsp[(2) - (2)].sn) ) ) ); } 5889 5889 break; … … 5892 5892 5893 5893 /* Line 1806 of yacc.c */ 5894 #line 80 4"parser.yy"5894 #line 803 "parser.yy" 5895 5895 { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (3)].sn)->set_last( (yyvsp[(2) - (3)].sn)->append_last_case( new StatementNode( build_compound( (yyvsp[(3) - (3)].sn) ) ) ) ) ); } 5896 5896 break; … … 5899 5899 5900 5900 /* Line 1806 of yacc.c */ 5901 #line 80 9"parser.yy"5901 #line 808 "parser.yy" 5902 5902 { (yyval.sn) = 0; } 5903 5903 break; … … 5906 5906 5907 5907 /* Line 1806 of yacc.c */ 5908 #line 81 5"parser.yy"5908 #line 814 "parser.yy" 5909 5909 { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( (yyvsp[(2) - (2)].sn) ); } 5910 5910 break; … … 5913 5913 5914 5914 /* Line 1806 of yacc.c */ 5915 #line 81 7"parser.yy"5915 #line 816 "parser.yy" 5916 5916 { (yyval.sn) = (yyvsp[(1) - (3)].sn)->append_last_case( new StatementNode( build_compound( (StatementNode *)(yyvsp[(2) - (3)].sn)->set_last( (yyvsp[(3) - (3)].sn) ) ) ) ); } 5917 5917 break; … … 5920 5920 5921 5921 /* Line 1806 of yacc.c */ 5922 #line 81 9"parser.yy"5922 #line 818 "parser.yy" 5923 5923 { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (3)].sn)->set_last( (yyvsp[(2) - (3)].sn)->append_last_case( (yyvsp[(3) - (3)].sn) ))); } 5924 5924 break; … … 5927 5927 5928 5928 /* Line 1806 of yacc.c */ 5929 #line 82 1"parser.yy"5929 #line 820 "parser.yy" 5930 5930 { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (4)].sn)->set_last( (yyvsp[(2) - (4)].sn)->append_last_case( new StatementNode( build_compound( (StatementNode *)(yyvsp[(3) - (4)].sn)->set_last( (yyvsp[(4) - (4)].sn) ) ) ) ) ) ); } 5931 5931 break; … … 5934 5934 5935 5935 /* Line 1806 of yacc.c */ 5936 #line 82 6"parser.yy"5936 #line 825 "parser.yy" 5937 5937 { (yyval.sn) = new StatementNode( build_branch( BranchStmt::Break ) ); } 5938 5938 break; … … 5941 5941 5942 5942 /* Line 1806 of yacc.c */ 5943 #line 83 2"parser.yy"5943 #line 831 "parser.yy" 5944 5944 { (yyval.sn) = 0; } 5945 5945 break; … … 5948 5948 5949 5949 /* Line 1806 of yacc.c */ 5950 #line 83 4"parser.yy"5950 #line 833 "parser.yy" 5951 5951 { (yyval.sn) = 0; } 5952 5952 break; … … 5955 5955 5956 5956 /* Line 1806 of yacc.c */ 5957 #line 83 9"parser.yy"5957 #line 838 "parser.yy" 5958 5958 { (yyval.sn) = new StatementNode( build_while( (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ) ); } 5959 5959 break; … … 5962 5962 5963 5963 /* Line 1806 of yacc.c */ 5964 #line 84 1"parser.yy"5964 #line 840 "parser.yy" 5965 5965 { (yyval.sn) = new StatementNode( build_while( (yyvsp[(5) - (7)].en), (yyvsp[(2) - (7)].sn), true ) ); } 5966 5966 break; … … 5969 5969 5970 5970 /* Line 1806 of yacc.c */ 5971 #line 84 3"parser.yy"5971 #line 842 "parser.yy" 5972 5972 { (yyval.sn) = new StatementNode( build_for( (yyvsp[(4) - (6)].fctl), (yyvsp[(6) - (6)].sn) ) ); } 5973 5973 break; … … 5976 5976 5977 5977 /* Line 1806 of yacc.c */ 5978 #line 84 8"parser.yy"5978 #line 847 "parser.yy" 5979 5979 { (yyval.fctl) = new ForCtl( (yyvsp[(1) - (6)].en), (yyvsp[(4) - (6)].en), (yyvsp[(6) - (6)].en) ); } 5980 5980 break; … … 5983 5983 5984 5984 /* Line 1806 of yacc.c */ 5985 #line 8 50"parser.yy"5985 #line 849 "parser.yy" 5986 5986 { (yyval.fctl) = new ForCtl( (yyvsp[(1) - (4)].decl), (yyvsp[(2) - (4)].en), (yyvsp[(4) - (4)].en) ); } 5987 5987 break; … … 5990 5990 5991 5991 /* Line 1806 of yacc.c */ 5992 #line 85 5"parser.yy"5992 #line 854 "parser.yy" 5993 5993 { (yyval.sn) = new StatementNode( build_branch( (yyvsp[(2) - (3)].tok), BranchStmt::Goto ) ); } 5994 5994 break; … … 5997 5997 5998 5998 /* Line 1806 of yacc.c */ 5999 #line 85 9"parser.yy"5999 #line 858 "parser.yy" 6000 6000 { (yyval.sn) = new StatementNode( build_computedgoto( (yyvsp[(3) - (4)].en) ) ); } 6001 6001 break; … … 6004 6004 6005 6005 /* Line 1806 of yacc.c */ 6006 #line 86 2"parser.yy"6006 #line 861 "parser.yy" 6007 6007 { (yyval.sn) = new StatementNode( build_branch( BranchStmt::Continue ) ); } 6008 6008 break; … … 6011 6011 6012 6012 /* Line 1806 of yacc.c */ 6013 #line 86 6"parser.yy"6013 #line 865 "parser.yy" 6014 6014 { (yyval.sn) = new StatementNode( build_branch( (yyvsp[(2) - (3)].tok), BranchStmt::Continue ) ); } 6015 6015 break; … … 6018 6018 6019 6019 /* Line 1806 of yacc.c */ 6020 #line 86 9"parser.yy"6020 #line 868 "parser.yy" 6021 6021 { (yyval.sn) = new StatementNode( build_branch( BranchStmt::Break ) ); } 6022 6022 break; … … 6025 6025 6026 6026 /* Line 1806 of yacc.c */ 6027 #line 87 3"parser.yy"6027 #line 872 "parser.yy" 6028 6028 { (yyval.sn) = new StatementNode( build_branch( (yyvsp[(2) - (3)].tok), BranchStmt::Break ) ); } 6029 6029 break; … … 6032 6032 6033 6033 /* Line 1806 of yacc.c */ 6034 #line 87 5"parser.yy"6034 #line 874 "parser.yy" 6035 6035 { (yyval.sn) = new StatementNode( build_return( (yyvsp[(2) - (3)].en) ) ); } 6036 6036 break; … … 6039 6039 6040 6040 /* Line 1806 of yacc.c */ 6041 #line 87 7"parser.yy"6041 #line 876 "parser.yy" 6042 6042 { (yyval.sn) = new StatementNode( build_throw( (yyvsp[(2) - (3)].en) ) ); } 6043 6043 break; … … 6046 6046 6047 6047 /* Line 1806 of yacc.c */ 6048 #line 87 9"parser.yy"6048 #line 878 "parser.yy" 6049 6049 { (yyval.sn) = new StatementNode( build_throw( (yyvsp[(2) - (3)].en) ) ); } 6050 6050 break; … … 6053 6053 6054 6054 /* Line 1806 of yacc.c */ 6055 #line 88 1"parser.yy"6055 #line 880 "parser.yy" 6056 6056 { (yyval.sn) = new StatementNode( build_throw( (yyvsp[(2) - (5)].en) ) ); } 6057 6057 break; … … 6060 6060 6061 6061 /* Line 1806 of yacc.c */ 6062 #line 88 6"parser.yy"6062 #line 885 "parser.yy" 6063 6063 { (yyval.sn) = new StatementNode( build_try( (yyvsp[(2) - (3)].sn), (yyvsp[(3) - (3)].sn), 0 ) ); } 6064 6064 break; … … 6067 6067 6068 6068 /* Line 1806 of yacc.c */ 6069 #line 88 8"parser.yy"6069 #line 887 "parser.yy" 6070 6070 { (yyval.sn) = new StatementNode( build_try( (yyvsp[(2) - (3)].sn), 0, (yyvsp[(3) - (3)].sn) ) ); } 6071 6071 break; … … 6074 6074 6075 6075 /* Line 1806 of yacc.c */ 6076 #line 8 90"parser.yy"6076 #line 889 "parser.yy" 6077 6077 { (yyval.sn) = new StatementNode( build_try( (yyvsp[(2) - (4)].sn), (yyvsp[(3) - (4)].sn), (yyvsp[(4) - (4)].sn) ) ); } 6078 6078 break; … … 6081 6081 6082 6082 /* Line 1806 of yacc.c */ 6083 #line 89 7"parser.yy"6083 #line 896 "parser.yy" 6084 6084 { (yyval.sn) = new StatementNode( build_catch( 0, (yyvsp[(5) - (5)].sn), true ) ); } 6085 6085 break; … … 6088 6088 6089 6089 /* Line 1806 of yacc.c */ 6090 #line 89 9"parser.yy"6090 #line 898 "parser.yy" 6091 6091 { (yyval.sn) = (StatementNode *)(yyvsp[(1) - (6)].sn)->set_last( new StatementNode( build_catch( 0, (yyvsp[(6) - (6)].sn), true ) ) ); } 6092 6092 break; … … 6095 6095 6096 6096 /* Line 1806 of yacc.c */ 6097 #line 90 1"parser.yy"6097 #line 900 "parser.yy" 6098 6098 { (yyval.sn) = new StatementNode( build_catch( 0, (yyvsp[(5) - (5)].sn), true ) ); } 6099 6099 break; … … 6102 6102 6103 6103 /* Line 1806 of yacc.c */ 6104 #line 90 3"parser.yy"6104 #line 902 "parser.yy" 6105 6105 { (yyval.sn) = (StatementNode *)(yyvsp[(1) - (6)].sn)->set_last( new StatementNode( build_catch( 0, (yyvsp[(6) - (6)].sn), true ) ) ); } 6106 6106 break; … … 6109 6109 6110 6110 /* Line 1806 of yacc.c */ 6111 #line 90 8"parser.yy"6111 #line 907 "parser.yy" 6112 6112 { (yyval.sn) = new StatementNode( build_catch( (yyvsp[(5) - (9)].decl), (yyvsp[(8) - (9)].sn) ) ); } 6113 6113 break; … … 6116 6116 6117 6117 /* Line 1806 of yacc.c */ 6118 #line 9 10"parser.yy"6118 #line 909 "parser.yy" 6119 6119 { (yyval.sn) = (StatementNode *)(yyvsp[(1) - (10)].sn)->set_last( new StatementNode( build_catch( (yyvsp[(6) - (10)].decl), (yyvsp[(9) - (10)].sn) ) ) ); } 6120 6120 break; … … 6123 6123 6124 6124 /* Line 1806 of yacc.c */ 6125 #line 91 2"parser.yy"6125 #line 911 "parser.yy" 6126 6126 { (yyval.sn) = new StatementNode( build_catch( (yyvsp[(5) - (9)].decl), (yyvsp[(8) - (9)].sn) ) ); } 6127 6127 break; … … 6130 6130 6131 6131 /* Line 1806 of yacc.c */ 6132 #line 91 4"parser.yy"6132 #line 913 "parser.yy" 6133 6133 { (yyval.sn) = (StatementNode *)(yyvsp[(1) - (10)].sn)->set_last( new StatementNode( build_catch( (yyvsp[(6) - (10)].decl), (yyvsp[(9) - (10)].sn) ) ) ); } 6134 6134 break; … … 6137 6137 6138 6138 /* Line 1806 of yacc.c */ 6139 #line 91 9"parser.yy"6139 #line 918 "parser.yy" 6140 6140 { 6141 6141 (yyval.sn) = new StatementNode( build_finally( (yyvsp[(2) - (2)].sn) ) ); … … 6146 6146 6147 6147 /* Line 1806 of yacc.c */ 6148 #line 93 2"parser.yy"6148 #line 931 "parser.yy" 6149 6149 { 6150 6150 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6156 6156 6157 6157 /* Line 1806 of yacc.c */ 6158 #line 93 7"parser.yy"6158 #line 936 "parser.yy" 6159 6159 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); } 6160 6160 break; … … 6163 6163 6164 6164 /* Line 1806 of yacc.c */ 6165 #line 93 9"parser.yy"6165 #line 938 "parser.yy" 6166 6166 { 6167 6167 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6173 6173 6174 6174 /* Line 1806 of yacc.c */ 6175 #line 94 8"parser.yy"6175 #line 947 "parser.yy" 6176 6176 { (yyval.sn) = new StatementNode( build_asmstmt( (yyvsp[(2) - (6)].flag), (yyvsp[(4) - (6)].constant), 0 ) ); } 6177 6177 break; … … 6180 6180 6181 6181 /* Line 1806 of yacc.c */ 6182 #line 9 50"parser.yy"6182 #line 949 "parser.yy" 6183 6183 { (yyval.sn) = new StatementNode( build_asmstmt( (yyvsp[(2) - (8)].flag), (yyvsp[(4) - (8)].constant), (yyvsp[(6) - (8)].en) ) ); } 6184 6184 break; … … 6187 6187 6188 6188 /* Line 1806 of yacc.c */ 6189 #line 95 2"parser.yy"6189 #line 951 "parser.yy" 6190 6190 { (yyval.sn) = new StatementNode( build_asmstmt( (yyvsp[(2) - (10)].flag), (yyvsp[(4) - (10)].constant), (yyvsp[(6) - (10)].en), (yyvsp[(8) - (10)].en) ) ); } 6191 6191 break; … … 6194 6194 6195 6195 /* Line 1806 of yacc.c */ 6196 #line 95 4"parser.yy"6196 #line 953 "parser.yy" 6197 6197 { (yyval.sn) = new StatementNode( build_asmstmt( (yyvsp[(2) - (12)].flag), (yyvsp[(4) - (12)].constant), (yyvsp[(6) - (12)].en), (yyvsp[(8) - (12)].en), (yyvsp[(10) - (12)].en) ) ); } 6198 6198 break; … … 6201 6201 6202 6202 /* Line 1806 of yacc.c */ 6203 #line 95 6"parser.yy"6203 #line 955 "parser.yy" 6204 6204 { (yyval.sn) = new StatementNode( build_asmstmt( (yyvsp[(2) - (14)].flag), (yyvsp[(5) - (14)].constant), 0, (yyvsp[(8) - (14)].en), (yyvsp[(10) - (14)].en), (yyvsp[(12) - (14)].label) ) ); } 6205 6205 break; … … 6208 6208 6209 6209 /* Line 1806 of yacc.c */ 6210 #line 96 1"parser.yy"6210 #line 960 "parser.yy" 6211 6211 { (yyval.flag) = false; } 6212 6212 break; … … 6215 6215 6216 6216 /* Line 1806 of yacc.c */ 6217 #line 96 3"parser.yy"6217 #line 962 "parser.yy" 6218 6218 { (yyval.flag) = true; } 6219 6219 break; … … 6222 6222 6223 6223 /* Line 1806 of yacc.c */ 6224 #line 96 8"parser.yy"6224 #line 967 "parser.yy" 6225 6225 { (yyval.en) = 0; } 6226 6226 break; … … 6229 6229 6230 6230 /* Line 1806 of yacc.c */ 6231 #line 97 5"parser.yy"6231 #line 974 "parser.yy" 6232 6232 { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_last( (yyvsp[(3) - (3)].en) ); } 6233 6233 break; … … 6236 6236 6237 6237 /* Line 1806 of yacc.c */ 6238 #line 9 80"parser.yy"6238 #line 979 "parser.yy" 6239 6239 { (yyval.en) = new ExpressionNode( build_asmexpr( 0, (yyvsp[(1) - (4)].constant), (yyvsp[(3) - (4)].en) ) ); } 6240 6240 break; … … 6243 6243 6244 6244 /* Line 1806 of yacc.c */ 6245 #line 98 2"parser.yy"6245 #line 981 "parser.yy" 6246 6246 { (yyval.en) = new ExpressionNode( build_asmexpr( (yyvsp[(2) - (7)].en), (yyvsp[(4) - (7)].constant), (yyvsp[(6) - (7)].en) ) ); } 6247 6247 break; … … 6250 6250 6251 6251 /* Line 1806 of yacc.c */ 6252 #line 98 7"parser.yy"6252 #line 986 "parser.yy" 6253 6253 { (yyval.en) = 0; } 6254 6254 break; … … 6257 6257 6258 6258 /* Line 1806 of yacc.c */ 6259 #line 98 9"parser.yy"6259 #line 988 "parser.yy" 6260 6260 { (yyval.en) = new ExpressionNode( (yyvsp[(1) - (1)].constant) ); } 6261 6261 break; … … 6264 6264 6265 6265 /* Line 1806 of yacc.c */ 6266 #line 99 1"parser.yy"6266 #line 990 "parser.yy" 6267 6267 { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_last( new ExpressionNode( (yyvsp[(3) - (3)].constant) ) ); } 6268 6268 break; … … 6271 6271 6272 6272 /* Line 1806 of yacc.c */ 6273 #line 99 6"parser.yy"6273 #line 995 "parser.yy" 6274 6274 { 6275 6275 (yyval.label) = new LabelNode(); (yyval.label)->labels.push_back( *(yyvsp[(1) - (1)].tok) ); … … 6281 6281 6282 6282 /* Line 1806 of yacc.c */ 6283 #line 100 1"parser.yy"6283 #line 1000 "parser.yy" 6284 6284 { 6285 6285 (yyval.label) = (yyvsp[(1) - (3)].label); (yyvsp[(1) - (3)].label)->labels.push_back( *(yyvsp[(3) - (3)].tok) ); … … 6291 6291 6292 6292 /* Line 1806 of yacc.c */ 6293 #line 101 1"parser.yy"6293 #line 1010 "parser.yy" 6294 6294 { (yyval.decl) = 0; } 6295 6295 break; … … 6298 6298 6299 6299 /* Line 1806 of yacc.c */ 6300 #line 101 8"parser.yy"6300 #line 1017 "parser.yy" 6301 6301 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ); } 6302 6302 break; … … 6305 6305 6306 6306 /* Line 1806 of yacc.c */ 6307 #line 102 3"parser.yy"6307 #line 1022 "parser.yy" 6308 6308 { (yyval.decl) = 0; } 6309 6309 break; … … 6312 6312 6313 6313 /* Line 1806 of yacc.c */ 6314 #line 10 30"parser.yy"6314 #line 1029 "parser.yy" 6315 6315 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ); } 6316 6316 break; 6317 6317 6318 6318 case 247: 6319 6320 /* Line 1806 of yacc.c */ 6321 #line 1043 "parser.yy" 6322 {} 6323 break; 6324 6325 case 248: 6319 6326 6320 6327 /* Line 1806 of yacc.c */ … … 6323 6330 break; 6324 6331 6325 case 248:6326 6327 /* Line 1806 of yacc.c */6328 #line 1045 "parser.yy"6329 {}6330 break;6331 6332 6332 case 256: 6333 6333 6334 6334 /* Line 1806 of yacc.c */ 6335 #line 107 4"parser.yy"6335 #line 1073 "parser.yy" 6336 6336 { 6337 6337 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6343 6343 6344 6344 /* Line 1806 of yacc.c */ 6345 #line 108 1"parser.yy"6345 #line 1080 "parser.yy" 6346 6346 { 6347 6347 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6353 6353 6354 6354 /* Line 1806 of yacc.c */ 6355 #line 108 6"parser.yy"6355 #line 1085 "parser.yy" 6356 6356 { 6357 6357 typedefTable.addToEnclosingScope( *(yyvsp[(5) - (6)].tok), TypedefTable::ID ); … … 6363 6363 6364 6364 /* Line 1806 of yacc.c */ 6365 #line 109 6"parser.yy"6365 #line 1095 "parser.yy" 6366 6366 { 6367 6367 typedefTable.setNextIdentifier( *(yyvsp[(2) - (3)].tok) ); … … 6373 6373 6374 6374 /* Line 1806 of yacc.c */ 6375 #line 110 1"parser.yy"6375 #line 1100 "parser.yy" 6376 6376 { 6377 6377 typedefTable.setNextIdentifier( *(yyvsp[(2) - (3)].tok) ); … … 6383 6383 6384 6384 /* Line 1806 of yacc.c */ 6385 #line 110 6"parser.yy"6385 #line 1105 "parser.yy" 6386 6386 { 6387 6387 typedefTable.setNextIdentifier( *(yyvsp[(3) - (4)].tok) ); … … 6393 6393 6394 6394 /* Line 1806 of yacc.c */ 6395 #line 111 4"parser.yy"6395 #line 1113 "parser.yy" 6396 6396 { 6397 6397 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6403 6403 6404 6404 /* Line 1806 of yacc.c */ 6405 #line 111 9"parser.yy"6405 #line 1118 "parser.yy" 6406 6406 { 6407 6407 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6413 6413 6414 6414 /* Line 1806 of yacc.c */ 6415 #line 112 4"parser.yy"6415 #line 1123 "parser.yy" 6416 6416 { 6417 6417 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6423 6423 6424 6424 /* Line 1806 of yacc.c */ 6425 #line 112 9"parser.yy"6425 #line 1128 "parser.yy" 6426 6426 { 6427 6427 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6433 6433 6434 6434 /* Line 1806 of yacc.c */ 6435 #line 113 4"parser.yy"6435 #line 1133 "parser.yy" 6436 6436 { 6437 6437 typedefTable.addToEnclosingScope( *(yyvsp[(5) - (5)].tok), TypedefTable::ID ); … … 6443 6443 6444 6444 /* Line 1806 of yacc.c */ 6445 #line 114 2"parser.yy"6445 #line 1141 "parser.yy" 6446 6446 { 6447 6447 (yyval.decl) = DeclarationNode::newFunction( (yyvsp[(3) - (8)].tok), DeclarationNode::newTuple( 0 ), (yyvsp[(6) - (8)].decl), 0, true ); … … 6452 6452 6453 6453 /* Line 1806 of yacc.c */ 6454 #line 116 5"parser.yy"6454 #line 1164 "parser.yy" 6455 6455 { 6456 6456 (yyval.decl) = DeclarationNode::newFunction( (yyvsp[(2) - (7)].tok), (yyvsp[(1) - (7)].decl), (yyvsp[(5) - (7)].decl), 0, true ); … … 6461 6461 6462 6462 /* Line 1806 of yacc.c */ 6463 #line 116 9"parser.yy"6463 #line 1168 "parser.yy" 6464 6464 { 6465 6465 (yyval.decl) = DeclarationNode::newFunction( (yyvsp[(2) - (7)].tok), (yyvsp[(1) - (7)].decl), (yyvsp[(5) - (7)].decl), 0, true ); … … 6470 6470 6471 6471 /* Line 1806 of yacc.c */ 6472 #line 117 6"parser.yy"6472 #line 1175 "parser.yy" 6473 6473 { (yyval.decl) = DeclarationNode::newTuple( (yyvsp[(3) - (5)].decl) ); } 6474 6474 break; … … 6477 6477 6478 6478 /* Line 1806 of yacc.c */ 6479 #line 11 80"parser.yy"6479 #line 1179 "parser.yy" 6480 6480 { (yyval.decl) = DeclarationNode::newTuple( (yyvsp[(3) - (9)].decl)->appendList( (yyvsp[(7) - (9)].decl) ) ); } 6481 6481 break; … … 6484 6484 6485 6485 /* Line 1806 of yacc.c */ 6486 #line 118 5"parser.yy"6486 #line 1184 "parser.yy" 6487 6487 { 6488 6488 typedefTable.addToEnclosingScope( TypedefTable::TD ); … … 6494 6494 6495 6495 /* Line 1806 of yacc.c */ 6496 #line 11 90"parser.yy"6496 #line 1189 "parser.yy" 6497 6497 { 6498 6498 typedefTable.addToEnclosingScope( TypedefTable::TD ); … … 6504 6504 6505 6505 /* Line 1806 of yacc.c */ 6506 #line 119 5"parser.yy"6506 #line 1194 "parser.yy" 6507 6507 { 6508 6508 typedefTable.addToEnclosingScope( *(yyvsp[(5) - (5)].tok), TypedefTable::TD ); … … 6514 6514 6515 6515 /* Line 1806 of yacc.c */ 6516 #line 120 6"parser.yy"6516 #line 1205 "parser.yy" 6517 6517 { 6518 6518 typedefTable.addToEnclosingScope( TypedefTable::TD ); … … 6524 6524 6525 6525 /* Line 1806 of yacc.c */ 6526 #line 121 1"parser.yy"6526 #line 1210 "parser.yy" 6527 6527 { 6528 6528 typedefTable.addToEnclosingScope( TypedefTable::TD ); … … 6534 6534 6535 6535 /* Line 1806 of yacc.c */ 6536 #line 121 6"parser.yy"6536 #line 1215 "parser.yy" 6537 6537 { 6538 6538 typedefTable.addToEnclosingScope( TypedefTable::TD ); … … 6544 6544 6545 6545 /* Line 1806 of yacc.c */ 6546 #line 122 1"parser.yy"6546 #line 1220 "parser.yy" 6547 6547 { 6548 6548 typedefTable.addToEnclosingScope( TypedefTable::TD ); … … 6554 6554 6555 6555 /* Line 1806 of yacc.c */ 6556 #line 122 6"parser.yy"6556 #line 1225 "parser.yy" 6557 6557 { 6558 6558 typedefTable.addToEnclosingScope( TypedefTable::TD ); … … 6564 6564 6565 6565 /* Line 1806 of yacc.c */ 6566 #line 123 5"parser.yy"6566 #line 1234 "parser.yy" 6567 6567 { 6568 6568 typedefTable.addToEnclosingScope( *(yyvsp[(2) - (4)].tok), TypedefTable::TD ); … … 6574 6574 6575 6575 /* Line 1806 of yacc.c */ 6576 #line 12 40"parser.yy"6576 #line 1239 "parser.yy" 6577 6577 { 6578 6578 typedefTable.addToEnclosingScope( *(yyvsp[(5) - (7)].tok), TypedefTable::TD ); … … 6584 6584 6585 6585 /* Line 1806 of yacc.c */ 6586 #line 125 7"parser.yy"6586 #line 1256 "parser.yy" 6587 6587 { 6588 6588 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6594 6594 6595 6595 /* Line 1806 of yacc.c */ 6596 #line 126 2"parser.yy"6596 #line 1261 "parser.yy" 6597 6597 { 6598 6598 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6604 6604 6605 6605 /* Line 1806 of yacc.c */ 6606 #line 128 4"parser.yy"6606 #line 1283 "parser.yy" 6607 6607 { (yyval.decl) = 0; } 6608 6608 break; … … 6611 6611 6612 6612 /* Line 1806 of yacc.c */ 6613 #line 129 6"parser.yy"6613 #line 1295 "parser.yy" 6614 6614 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6615 6615 break; … … 6618 6618 6619 6619 /* Line 1806 of yacc.c */ 6620 #line 130 7"parser.yy"6620 #line 1306 "parser.yy" 6621 6621 { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Const ); } 6622 6622 break; … … 6625 6625 6626 6626 /* Line 1806 of yacc.c */ 6627 #line 130 9"parser.yy"6627 #line 1308 "parser.yy" 6628 6628 { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Restrict ); } 6629 6629 break; … … 6632 6632 6633 6633 /* Line 1806 of yacc.c */ 6634 #line 131 1"parser.yy"6634 #line 1310 "parser.yy" 6635 6635 { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Volatile ); } 6636 6636 break; … … 6639 6639 6640 6640 /* Line 1806 of yacc.c */ 6641 #line 131 3"parser.yy"6641 #line 1312 "parser.yy" 6642 6642 { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Lvalue ); } 6643 6643 break; … … 6646 6646 6647 6647 /* Line 1806 of yacc.c */ 6648 #line 131 5"parser.yy"6648 #line 1314 "parser.yy" 6649 6649 { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Atomic ); } 6650 6650 break; … … 6653 6653 6654 6654 /* Line 1806 of yacc.c */ 6655 #line 131 7"parser.yy"6655 #line 1316 "parser.yy" 6656 6656 { 6657 6657 typedefTable.enterScope(); … … 6662 6662 6663 6663 /* Line 1806 of yacc.c */ 6664 #line 132 1"parser.yy"6664 #line 1320 "parser.yy" 6665 6665 { 6666 6666 typedefTable.leaveScope(); … … 6672 6672 6673 6673 /* Line 1806 of yacc.c */ 6674 #line 13 30"parser.yy"6674 #line 1329 "parser.yy" 6675 6675 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6676 6676 break; … … 6679 6679 6680 6680 /* Line 1806 of yacc.c */ 6681 #line 133 2"parser.yy"6681 #line 1331 "parser.yy" 6682 6682 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); } 6683 6683 break; … … 6686 6686 6687 6687 /* Line 1806 of yacc.c */ 6688 #line 134 3"parser.yy"6688 #line 1342 "parser.yy" 6689 6689 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6690 6690 break; … … 6693 6693 6694 6694 /* Line 1806 of yacc.c */ 6695 #line 134 8"parser.yy"6695 #line 1347 "parser.yy" 6696 6696 { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Extern ); } 6697 6697 break; … … 6700 6700 6701 6701 /* Line 1806 of yacc.c */ 6702 #line 13 50"parser.yy"6702 #line 1349 "parser.yy" 6703 6703 { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Static ); } 6704 6704 break; … … 6707 6707 6708 6708 /* Line 1806 of yacc.c */ 6709 #line 135 2"parser.yy"6709 #line 1351 "parser.yy" 6710 6710 { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Auto ); } 6711 6711 break; … … 6714 6714 6715 6715 /* Line 1806 of yacc.c */ 6716 #line 135 4"parser.yy"6716 #line 1353 "parser.yy" 6717 6717 { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Register ); } 6718 6718 break; … … 6721 6721 6722 6722 /* Line 1806 of yacc.c */ 6723 #line 135 7"parser.yy"6723 #line 1356 "parser.yy" 6724 6724 { (yyval.decl) = new DeclarationNode; (yyval.decl)->isInline = true; } 6725 6725 break; … … 6728 6728 6729 6729 /* Line 1806 of yacc.c */ 6730 #line 135 9"parser.yy"6730 #line 1358 "parser.yy" 6731 6731 { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Fortran ); } 6732 6732 break; … … 6735 6735 6736 6736 /* Line 1806 of yacc.c */ 6737 #line 136 2"parser.yy"6737 #line 1361 "parser.yy" 6738 6738 { (yyval.decl) = new DeclarationNode; (yyval.decl)->isNoreturn = true; } 6739 6739 break; … … 6742 6742 6743 6743 /* Line 1806 of yacc.c */ 6744 #line 136 4"parser.yy"6744 #line 1363 "parser.yy" 6745 6745 { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Threadlocal ); } 6746 6746 break; … … 6749 6749 6750 6750 /* Line 1806 of yacc.c */ 6751 #line 136 9"parser.yy"6751 #line 1368 "parser.yy" 6752 6752 { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Char ); } 6753 6753 break; … … 6756 6756 6757 6757 /* Line 1806 of yacc.c */ 6758 #line 137 1"parser.yy"6758 #line 1370 "parser.yy" 6759 6759 { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Double ); } 6760 6760 break; … … 6763 6763 6764 6764 /* Line 1806 of yacc.c */ 6765 #line 137 3"parser.yy"6765 #line 1372 "parser.yy" 6766 6766 { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Float ); } 6767 6767 break; … … 6770 6770 6771 6771 /* Line 1806 of yacc.c */ 6772 #line 137 5"parser.yy"6772 #line 1374 "parser.yy" 6773 6773 { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Int ); } 6774 6774 break; … … 6777 6777 6778 6778 /* Line 1806 of yacc.c */ 6779 #line 137 7"parser.yy"6779 #line 1376 "parser.yy" 6780 6780 { (yyval.decl) = DeclarationNode::newLength( DeclarationNode::Long ); } 6781 6781 break; … … 6784 6784 6785 6785 /* Line 1806 of yacc.c */ 6786 #line 137 9"parser.yy"6786 #line 1378 "parser.yy" 6787 6787 { (yyval.decl) = DeclarationNode::newLength( DeclarationNode::Short ); } 6788 6788 break; … … 6791 6791 6792 6792 /* Line 1806 of yacc.c */ 6793 #line 138 1"parser.yy"6793 #line 1380 "parser.yy" 6794 6794 { (yyval.decl) = DeclarationNode::newSignedNess( DeclarationNode::Signed ); } 6795 6795 break; … … 6798 6798 6799 6799 /* Line 1806 of yacc.c */ 6800 #line 138 3"parser.yy"6800 #line 1382 "parser.yy" 6801 6801 { (yyval.decl) = DeclarationNode::newSignedNess( DeclarationNode::Unsigned ); } 6802 6802 break; … … 6805 6805 6806 6806 /* Line 1806 of yacc.c */ 6807 #line 138 5"parser.yy"6807 #line 1384 "parser.yy" 6808 6808 { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Void ); } 6809 6809 break; … … 6812 6812 6813 6813 /* Line 1806 of yacc.c */ 6814 #line 138 7"parser.yy"6814 #line 1386 "parser.yy" 6815 6815 { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Bool ); } 6816 6816 break; … … 6819 6819 6820 6820 /* Line 1806 of yacc.c */ 6821 #line 138 9"parser.yy"6821 #line 1388 "parser.yy" 6822 6822 { (yyval.decl) = DeclarationNode::newComplexType( DeclarationNode::Complex ); } 6823 6823 break; … … 6826 6826 6827 6827 /* Line 1806 of yacc.c */ 6828 #line 139 1"parser.yy"6828 #line 1390 "parser.yy" 6829 6829 { (yyval.decl) = DeclarationNode::newComplexType( DeclarationNode::Imaginary ); } 6830 6830 break; … … 6833 6833 6834 6834 /* Line 1806 of yacc.c */ 6835 #line 139 3"parser.yy"6835 #line 1392 "parser.yy" 6836 6836 { (yyval.decl) = DeclarationNode::newBuiltinType( DeclarationNode::Valist ); } 6837 6837 break; … … 6840 6840 6841 6841 /* Line 1806 of yacc.c */ 6842 #line 1 400"parser.yy"6842 #line 1399 "parser.yy" 6843 6843 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 6844 6844 break; … … 6847 6847 6848 6848 /* Line 1806 of yacc.c */ 6849 #line 140 2"parser.yy"6849 #line 1401 "parser.yy" 6850 6850 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6851 6851 break; … … 6854 6854 6855 6855 /* Line 1806 of yacc.c */ 6856 #line 140 4"parser.yy"6856 #line 1403 "parser.yy" 6857 6857 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); } 6858 6858 break; … … 6861 6861 6862 6862 /* Line 1806 of yacc.c */ 6863 #line 140 6"parser.yy"6863 #line 1405 "parser.yy" 6864 6864 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addType( (yyvsp[(1) - (3)].decl) ); } 6865 6865 break; … … 6868 6868 6869 6869 /* Line 1806 of yacc.c */ 6870 #line 141 2"parser.yy"6870 #line 1411 "parser.yy" 6871 6871 { (yyval.decl) = (yyvsp[(2) - (3)].decl)->addQualifiers( (yyvsp[(1) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); } 6872 6872 break; … … 6875 6875 6876 6876 /* Line 1806 of yacc.c */ 6877 #line 141 9"parser.yy"6877 #line 1418 "parser.yy" 6878 6878 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 6879 6879 break; … … 6882 6882 6883 6883 /* Line 1806 of yacc.c */ 6884 #line 142 1"parser.yy"6884 #line 1420 "parser.yy" 6885 6885 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6886 6886 break; … … 6889 6889 6890 6890 /* Line 1806 of yacc.c */ 6891 #line 142 3"parser.yy"6891 #line 1422 "parser.yy" 6892 6892 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addType( (yyvsp[(2) - (2)].decl) ); } 6893 6893 break; … … 6896 6896 6897 6897 /* Line 1806 of yacc.c */ 6898 #line 142 8"parser.yy"6898 #line 1427 "parser.yy" 6899 6899 { (yyval.decl) = (yyvsp[(3) - (4)].decl); } 6900 6900 break; … … 6903 6903 6904 6904 /* Line 1806 of yacc.c */ 6905 #line 14 30"parser.yy"6905 #line 1429 "parser.yy" 6906 6906 { (yyval.decl) = DeclarationNode::newTypeof( (yyvsp[(3) - (4)].en) ); } 6907 6907 break; … … 6910 6910 6911 6911 /* Line 1806 of yacc.c */ 6912 #line 143 2"parser.yy"6912 #line 1431 "parser.yy" 6913 6913 { (yyval.decl) = DeclarationNode::newAttr( (yyvsp[(1) - (4)].tok), (yyvsp[(3) - (4)].decl) ); } 6914 6914 break; … … 6917 6917 6918 6918 /* Line 1806 of yacc.c */ 6919 #line 143 4"parser.yy"6919 #line 1433 "parser.yy" 6920 6920 { (yyval.decl) = DeclarationNode::newAttr( (yyvsp[(1) - (4)].tok), (yyvsp[(3) - (4)].en) ); } 6921 6921 break; … … 6924 6924 6925 6925 /* Line 1806 of yacc.c */ 6926 #line 14 40"parser.yy"6926 #line 1439 "parser.yy" 6927 6927 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 6928 6928 break; … … 6931 6931 6932 6932 /* Line 1806 of yacc.c */ 6933 #line 144 2"parser.yy"6933 #line 1441 "parser.yy" 6934 6934 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6935 6935 break; … … 6938 6938 6939 6939 /* Line 1806 of yacc.c */ 6940 #line 144 4"parser.yy"6940 #line 1443 "parser.yy" 6941 6941 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); } 6942 6942 break; … … 6945 6945 6946 6946 /* Line 1806 of yacc.c */ 6947 #line 14 50"parser.yy"6947 #line 1449 "parser.yy" 6948 6948 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 6949 6949 break; … … 6952 6952 6953 6953 /* Line 1806 of yacc.c */ 6954 #line 145 2"parser.yy"6954 #line 1451 "parser.yy" 6955 6955 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6956 6956 break; … … 6959 6959 6960 6960 /* Line 1806 of yacc.c */ 6961 #line 145 8"parser.yy"6961 #line 1457 "parser.yy" 6962 6962 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 6963 6963 break; … … 6966 6966 6967 6967 /* Line 1806 of yacc.c */ 6968 #line 14 60"parser.yy"6968 #line 1459 "parser.yy" 6969 6969 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6970 6970 break; … … 6973 6973 6974 6974 /* Line 1806 of yacc.c */ 6975 #line 146 2"parser.yy"6975 #line 1461 "parser.yy" 6976 6976 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); } 6977 6977 break; … … 6980 6980 6981 6981 /* Line 1806 of yacc.c */ 6982 #line 146 7"parser.yy"6982 #line 1466 "parser.yy" 6983 6983 { (yyval.decl) = DeclarationNode::newFromTypedef( (yyvsp[(1) - (1)].tok) ); } 6984 6984 break; … … 6987 6987 6988 6988 /* Line 1806 of yacc.c */ 6989 #line 146 9"parser.yy"6989 #line 1468 "parser.yy" 6990 6990 { (yyval.decl) = DeclarationNode::newFromTypedef( (yyvsp[(2) - (2)].tok) )->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 6991 6991 break; … … 6994 6994 6995 6995 /* Line 1806 of yacc.c */ 6996 #line 147 1"parser.yy"6996 #line 1470 "parser.yy" 6997 6997 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6998 6998 break; … … 7001 7001 7002 7002 /* Line 1806 of yacc.c */ 7003 #line 148 1"parser.yy"7003 #line 1480 "parser.yy" 7004 7004 { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (4)].aggKey), nullptr, nullptr, (yyvsp[(3) - (4)].decl), true ); } 7005 7005 break; … … 7008 7008 7009 7009 /* Line 1806 of yacc.c */ 7010 #line 148 3"parser.yy"7010 #line 1482 "parser.yy" 7011 7011 { 7012 7012 typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) ); … … 7018 7018 7019 7019 /* Line 1806 of yacc.c */ 7020 #line 148 8"parser.yy"7020 #line 1487 "parser.yy" 7021 7021 { typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) ); } 7022 7022 break; … … 7025 7025 7026 7026 /* Line 1806 of yacc.c */ 7027 #line 14 90"parser.yy"7027 #line 1489 "parser.yy" 7028 7028 { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (6)].aggKey), (yyvsp[(2) - (6)].tok), nullptr, (yyvsp[(5) - (6)].decl), true ); } 7029 7029 break; … … 7032 7032 7033 7033 /* Line 1806 of yacc.c */ 7034 #line 149 2"parser.yy"7034 #line 1491 "parser.yy" 7035 7035 { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (7)].aggKey), nullptr, (yyvsp[(3) - (7)].en), (yyvsp[(6) - (7)].decl), false ); } 7036 7036 break; … … 7039 7039 7040 7040 /* Line 1806 of yacc.c */ 7041 #line 149 4"parser.yy"7041 #line 1493 "parser.yy" 7042 7042 { (yyval.decl) = (yyvsp[(2) - (2)].decl); } 7043 7043 break; … … 7046 7046 7047 7047 /* Line 1806 of yacc.c */ 7048 #line 149 9"parser.yy"7048 #line 1498 "parser.yy" 7049 7049 { (yyval.aggKey) = DeclarationNode::Struct; } 7050 7050 break; … … 7053 7053 7054 7054 /* Line 1806 of yacc.c */ 7055 #line 150 1"parser.yy"7055 #line 1500 "parser.yy" 7056 7056 { (yyval.aggKey) = DeclarationNode::Union; } 7057 7057 break; … … 7060 7060 7061 7061 /* Line 1806 of yacc.c */ 7062 #line 150 6"parser.yy"7062 #line 1505 "parser.yy" 7063 7063 { (yyval.decl) = 0; } 7064 7064 break; … … 7067 7067 7068 7068 /* Line 1806 of yacc.c */ 7069 #line 150 8"parser.yy"7069 #line 1507 "parser.yy" 7070 7070 { (yyval.decl) = (yyvsp[(1) - (2)].decl) != 0 ? (yyvsp[(1) - (2)].decl)->appendList( (yyvsp[(2) - (2)].decl) ) : (yyvsp[(2) - (2)].decl); } 7071 7071 break; … … 7074 7074 7075 7075 /* Line 1806 of yacc.c */ 7076 #line 151 4"parser.yy"7076 #line 1513 "parser.yy" 7077 7077 { (yyval.decl) = (yyvsp[(2) - (3)].decl)->set_extension( true ); } 7078 7078 break; … … 7081 7081 7082 7082 /* Line 1806 of yacc.c */ 7083 #line 151 7"parser.yy"7083 #line 1516 "parser.yy" 7084 7084 { // mark all fields in list 7085 7085 for ( DeclarationNode *iter = (yyvsp[(2) - (3)].decl); iter != nullptr; iter = (DeclarationNode *)iter->get_next() ) … … 7092 7092 7093 7093 /* Line 1806 of yacc.c */ 7094 #line 152 7"parser.yy"7094 #line 1526 "parser.yy" 7095 7095 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addName( (yyvsp[(2) - (2)].tok) ); } 7096 7096 break; … … 7099 7099 7100 7100 /* Line 1806 of yacc.c */ 7101 #line 152 9"parser.yy"7101 #line 1528 "parser.yy" 7102 7102 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(1) - (3)].decl)->cloneType( (yyvsp[(3) - (3)].tok) ) ); } 7103 7103 break; … … 7106 7106 7107 7107 /* Line 1806 of yacc.c */ 7108 #line 153 1"parser.yy"7108 #line 1530 "parser.yy" 7109 7109 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->appendList( (yyvsp[(1) - (2)].decl)->cloneType( 0 ) ); } 7110 7110 break; … … 7113 7113 7114 7114 /* Line 1806 of yacc.c */ 7115 #line 153 6"parser.yy"7115 #line 1535 "parser.yy" 7116 7116 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); } 7117 7117 break; … … 7120 7120 7121 7121 /* Line 1806 of yacc.c */ 7122 #line 153 8"parser.yy"7122 #line 1537 "parser.yy" 7123 7123 { (yyval.decl) = (yyvsp[(1) - (4)].decl)->appendList( (yyvsp[(1) - (4)].decl)->cloneBaseType( (yyvsp[(4) - (4)].decl) ) ); } 7124 7124 break; … … 7127 7127 7128 7128 /* Line 1806 of yacc.c */ 7129 #line 154 3"parser.yy"7129 #line 1542 "parser.yy" 7130 7130 { (yyval.decl) = DeclarationNode::newName( 0 ); /* XXX */ } 7131 7131 break; … … 7134 7134 7135 7135 /* Line 1806 of yacc.c */ 7136 #line 154 5"parser.yy"7136 #line 1544 "parser.yy" 7137 7137 { (yyval.decl) = DeclarationNode::newBitfield( (yyvsp[(1) - (1)].en) ); } 7138 7138 break; … … 7141 7141 7142 7142 /* Line 1806 of yacc.c */ 7143 #line 154 8"parser.yy"7143 #line 1547 "parser.yy" 7144 7144 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addBitfield( (yyvsp[(2) - (2)].en) ); } 7145 7145 break; … … 7148 7148 7149 7149 /* Line 1806 of yacc.c */ 7150 #line 155 1"parser.yy"7150 #line 1550 "parser.yy" 7151 7151 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addBitfield( (yyvsp[(2) - (2)].en) ); } 7152 7152 break; … … 7155 7155 7156 7156 /* Line 1806 of yacc.c */ 7157 #line 155 7"parser.yy"7157 #line 1556 "parser.yy" 7158 7158 { (yyval.en) = 0; } 7159 7159 break; … … 7162 7162 7163 7163 /* Line 1806 of yacc.c */ 7164 #line 155 9"parser.yy"7164 #line 1558 "parser.yy" 7165 7165 { (yyval.en) = (yyvsp[(1) - (1)].en); } 7166 7166 break; … … 7169 7169 7170 7170 /* Line 1806 of yacc.c */ 7171 #line 156 4"parser.yy"7171 #line 1563 "parser.yy" 7172 7172 { (yyval.en) = (yyvsp[(2) - (2)].en); } 7173 7173 break; … … 7176 7176 7177 7177 /* Line 1806 of yacc.c */ 7178 #line 157 3"parser.yy"7178 #line 1572 "parser.yy" 7179 7179 { (yyval.decl) = DeclarationNode::newEnum( nullptr, (yyvsp[(3) - (5)].decl) ); } 7180 7180 break; … … 7183 7183 7184 7184 /* Line 1806 of yacc.c */ 7185 #line 157 5"parser.yy"7185 #line 1574 "parser.yy" 7186 7186 { 7187 7187 typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) ); … … 7193 7193 7194 7194 /* Line 1806 of yacc.c */ 7195 #line 15 80"parser.yy"7195 #line 1579 "parser.yy" 7196 7196 { typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) ); } 7197 7197 break; … … 7200 7200 7201 7201 /* Line 1806 of yacc.c */ 7202 #line 158 2"parser.yy"7202 #line 1581 "parser.yy" 7203 7203 { (yyval.decl) = DeclarationNode::newEnum( (yyvsp[(2) - (7)].tok), (yyvsp[(5) - (7)].decl) ); } 7204 7204 break; … … 7207 7207 7208 7208 /* Line 1806 of yacc.c */ 7209 #line 158 7"parser.yy"7209 #line 1586 "parser.yy" 7210 7210 { (yyval.decl) = DeclarationNode::newEnumConstant( (yyvsp[(1) - (2)].tok), (yyvsp[(2) - (2)].en) ); } 7211 7211 break; … … 7214 7214 7215 7215 /* Line 1806 of yacc.c */ 7216 #line 158 9"parser.yy"7216 #line 1588 "parser.yy" 7217 7217 { (yyval.decl) = (yyvsp[(1) - (4)].decl)->appendList( DeclarationNode::newEnumConstant( (yyvsp[(3) - (4)].tok), (yyvsp[(4) - (4)].en) ) ); } 7218 7218 break; … … 7221 7221 7222 7222 /* Line 1806 of yacc.c */ 7223 #line 159 4"parser.yy"7223 #line 1593 "parser.yy" 7224 7224 { (yyval.en) = 0; } 7225 7225 break; … … 7228 7228 7229 7229 /* Line 1806 of yacc.c */ 7230 #line 159 6"parser.yy"7230 #line 1595 "parser.yy" 7231 7231 { (yyval.en) = (yyvsp[(2) - (2)].en); } 7232 7232 break; … … 7235 7235 7236 7236 /* Line 1806 of yacc.c */ 7237 #line 160 3"parser.yy"7237 #line 1602 "parser.yy" 7238 7238 { (yyval.decl) = 0; } 7239 7239 break; … … 7242 7242 7243 7243 /* Line 1806 of yacc.c */ 7244 #line 161 1"parser.yy"7244 #line 1610 "parser.yy" 7245 7245 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); } 7246 7246 break; … … 7249 7249 7250 7250 /* Line 1806 of yacc.c */ 7251 #line 161 3"parser.yy"7251 #line 1612 "parser.yy" 7252 7252 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->addVarArgs(); } 7253 7253 break; … … 7256 7256 7257 7257 /* Line 1806 of yacc.c */ 7258 #line 161 5"parser.yy"7258 #line 1614 "parser.yy" 7259 7259 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->addVarArgs(); } 7260 7260 break; … … 7263 7263 7264 7264 /* Line 1806 of yacc.c */ 7265 #line 162 3"parser.yy"7265 #line 1622 "parser.yy" 7266 7266 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); } 7267 7267 break; … … 7270 7270 7271 7271 /* Line 1806 of yacc.c */ 7272 #line 162 5"parser.yy"7272 #line 1624 "parser.yy" 7273 7273 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); } 7274 7274 break; … … 7277 7277 7278 7278 /* Line 1806 of yacc.c */ 7279 #line 162 7"parser.yy"7279 #line 1626 "parser.yy" 7280 7280 { (yyval.decl) = (yyvsp[(1) - (9)].decl)->appendList( (yyvsp[(5) - (9)].decl) )->appendList( (yyvsp[(9) - (9)].decl) ); } 7281 7281 break; … … 7284 7284 7285 7285 /* Line 1806 of yacc.c */ 7286 #line 163 3"parser.yy"7286 #line 1632 "parser.yy" 7287 7287 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); } 7288 7288 break; … … 7291 7291 7292 7292 /* Line 1806 of yacc.c */ 7293 #line 163 8"parser.yy"7293 #line 1637 "parser.yy" 7294 7294 { (yyval.decl) = 0; } 7295 7295 break; … … 7298 7298 7299 7299 /* Line 1806 of yacc.c */ 7300 #line 164 5"parser.yy"7300 #line 1644 "parser.yy" 7301 7301 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->addVarArgs(); } 7302 7302 break; … … 7305 7305 7306 7306 /* Line 1806 of yacc.c */ 7307 #line 165 2"parser.yy"7307 #line 1651 "parser.yy" 7308 7308 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); } 7309 7309 break; … … 7312 7312 7313 7313 /* Line 1806 of yacc.c */ 7314 #line 165 4"parser.yy"7314 #line 1653 "parser.yy" 7315 7315 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); } 7316 7316 break; … … 7319 7319 7320 7320 /* Line 1806 of yacc.c */ 7321 #line 166 3"parser.yy"7321 #line 1662 "parser.yy" 7322 7322 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addName( (yyvsp[(2) - (3)].tok) ); } 7323 7323 break; … … 7326 7326 7327 7327 /* Line 1806 of yacc.c */ 7328 #line 166 6"parser.yy"7328 #line 1665 "parser.yy" 7329 7329 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addName( (yyvsp[(2) - (3)].tok) ); } 7330 7330 break; … … 7333 7333 7334 7334 /* Line 1806 of yacc.c */ 7335 #line 166 8"parser.yy"7335 #line 1667 "parser.yy" 7336 7336 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addName( (yyvsp[(3) - (4)].tok) )->addQualifiers( (yyvsp[(1) - (4)].decl) ); } 7337 7337 break; … … 7340 7340 7341 7341 /* Line 1806 of yacc.c */ 7342 #line 167 8"parser.yy"7342 #line 1677 "parser.yy" 7343 7343 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 7344 7344 break; … … 7347 7347 7348 7348 /* Line 1806 of yacc.c */ 7349 #line 168 4"parser.yy"7349 #line 1683 "parser.yy" 7350 7350 { 7351 7351 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7357 7357 7358 7358 /* Line 1806 of yacc.c */ 7359 #line 168 9"parser.yy"7359 #line 1688 "parser.yy" 7360 7360 { 7361 7361 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7367 7367 7368 7368 /* Line 1806 of yacc.c */ 7369 #line 169 8"parser.yy"7369 #line 1697 "parser.yy" 7370 7370 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); } 7371 7371 break; … … 7374 7374 7375 7375 /* Line 1806 of yacc.c */ 7376 #line 170 7"parser.yy"7376 #line 1706 "parser.yy" 7377 7377 { (yyval.decl) = DeclarationNode::newName( (yyvsp[(1) - (1)].tok) ); } 7378 7378 break; … … 7381 7381 7382 7382 /* Line 1806 of yacc.c */ 7383 #line 170 9"parser.yy"7383 #line 1708 "parser.yy" 7384 7384 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( DeclarationNode::newName( (yyvsp[(3) - (3)].tok) ) ); } 7385 7385 break; … … 7388 7388 7389 7389 /* Line 1806 of yacc.c */ 7390 #line 173 4"parser.yy"7390 #line 1733 "parser.yy" 7391 7391 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); } 7392 7392 break; … … 7395 7395 7396 7396 /* Line 1806 of yacc.c */ 7397 #line 174 2"parser.yy"7397 #line 1741 "parser.yy" 7398 7398 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); } 7399 7399 break; … … 7402 7402 7403 7403 /* Line 1806 of yacc.c */ 7404 #line 174 7"parser.yy"7404 #line 1746 "parser.yy" 7405 7405 { (yyval.in) = 0; } 7406 7406 break; … … 7409 7409 7410 7410 /* Line 1806 of yacc.c */ 7411 #line 174 9"parser.yy"7411 #line 1748 "parser.yy" 7412 7412 { (yyval.in) = (yyvsp[(2) - (2)].in); } 7413 7413 break; … … 7416 7416 7417 7417 /* Line 1806 of yacc.c */ 7418 #line 175 1"parser.yy"7418 #line 1750 "parser.yy" 7419 7419 { (yyval.in) = (yyvsp[(2) - (2)].in)->set_maybeConstructed( false ); } 7420 7420 break; … … 7423 7423 7424 7424 /* Line 1806 of yacc.c */ 7425 #line 1754 "parser.yy" 7426 { (yyval.in) = new InitializerNode( (yyvsp[(1) - (1)].en) ); } 7427 break; 7428 7429 case 460: 7430 7431 /* Line 1806 of yacc.c */ 7425 7432 #line 1755 "parser.yy" 7426 { (yyval.in) = new InitializerNode( (yyvsp[(1) - (1)].en) ); }7427 break;7428 7429 case 460:7430 7431 /* Line 1806 of yacc.c */7432 #line 1756 "parser.yy"7433 7433 { (yyval.in) = new InitializerNode( (yyvsp[(2) - (4)].in), true ); } 7434 7434 break; … … 7437 7437 7438 7438 /* Line 1806 of yacc.c */ 7439 #line 176 1"parser.yy"7439 #line 1760 "parser.yy" 7440 7440 { (yyval.in) = 0; } 7441 7441 break; … … 7444 7444 7445 7445 /* Line 1806 of yacc.c */ 7446 #line 1762 "parser.yy" 7447 { (yyval.in) = (yyvsp[(2) - (2)].in)->set_designators( (yyvsp[(1) - (2)].en) ); } 7448 break; 7449 7450 case 464: 7451 7452 /* Line 1806 of yacc.c */ 7446 7453 #line 1763 "parser.yy" 7447 { (yyval.in) = (yyvsp[(2) - (2)].in)->set_designators( (yyvsp[(1) - (2)].en) ); }7448 break;7449 7450 case 464:7451 7452 /* Line 1806 of yacc.c */7453 #line 1764 "parser.yy"7454 7454 { (yyval.in) = (InitializerNode *)( (yyvsp[(1) - (3)].in)->set_last( (yyvsp[(3) - (3)].in) ) ); } 7455 7455 break; … … 7458 7458 7459 7459 /* Line 1806 of yacc.c */ 7460 #line 176 6"parser.yy"7460 #line 1765 "parser.yy" 7461 7461 { (yyval.in) = (InitializerNode *)( (yyvsp[(1) - (4)].in)->set_last( (yyvsp[(4) - (4)].in)->set_designators( (yyvsp[(3) - (4)].en) ) ) ); } 7462 7462 break; … … 7465 7465 7466 7466 /* Line 1806 of yacc.c */ 7467 #line 178 2"parser.yy"7467 #line 1781 "parser.yy" 7468 7468 { (yyval.en) = new ExpressionNode( build_varref( (yyvsp[(1) - (2)].tok) ) ); } 7469 7469 break; … … 7472 7472 7473 7473 /* Line 1806 of yacc.c */ 7474 #line 178 8"parser.yy"7474 #line 1787 "parser.yy" 7475 7475 { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (2)].en)->set_last( (yyvsp[(2) - (2)].en) ) ); } 7476 7476 break; … … 7479 7479 7480 7480 /* Line 1806 of yacc.c */ 7481 #line 179 4"parser.yy"7481 #line 1793 "parser.yy" 7482 7482 { (yyval.en) = new ExpressionNode( build_varref( (yyvsp[(2) - (2)].tok) ) ); } 7483 7483 break; … … 7486 7486 7487 7487 /* Line 1806 of yacc.c */ 7488 #line 179 7"parser.yy"7488 #line 1796 "parser.yy" 7489 7489 { (yyval.en) = (yyvsp[(3) - (5)].en); } 7490 7490 break; … … 7493 7493 7494 7494 /* Line 1806 of yacc.c */ 7495 #line 179 9"parser.yy"7495 #line 1798 "parser.yy" 7496 7496 { (yyval.en) = (yyvsp[(3) - (5)].en); } 7497 7497 break; … … 7500 7500 7501 7501 /* Line 1806 of yacc.c */ 7502 #line 180 1"parser.yy"7502 #line 1800 "parser.yy" 7503 7503 { (yyval.en) = new ExpressionNode( build_range( (yyvsp[(3) - (7)].en), (yyvsp[(5) - (7)].en) ) ); } 7504 7504 break; … … 7507 7507 7508 7508 /* Line 1806 of yacc.c */ 7509 #line 180 3"parser.yy"7509 #line 1802 "parser.yy" 7510 7510 { (yyval.en) = (yyvsp[(4) - (6)].en); } 7511 7511 break; … … 7514 7514 7515 7515 /* Line 1806 of yacc.c */ 7516 #line 182 7"parser.yy"7516 #line 1826 "parser.yy" 7517 7517 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 7518 7518 break; … … 7521 7521 7522 7522 /* Line 1806 of yacc.c */ 7523 #line 182 9"parser.yy"7523 #line 1828 "parser.yy" 7524 7524 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 7525 7525 break; … … 7528 7528 7529 7529 /* Line 1806 of yacc.c */ 7530 #line 183 1"parser.yy"7530 #line 1830 "parser.yy" 7531 7531 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); } 7532 7532 break; … … 7535 7535 7536 7536 /* Line 1806 of yacc.c */ 7537 #line 183 7"parser.yy"7537 #line 1836 "parser.yy" 7538 7538 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 7539 7539 break; … … 7542 7542 7543 7543 /* Line 1806 of yacc.c */ 7544 #line 183 9"parser.yy"7544 #line 1838 "parser.yy" 7545 7545 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 7546 7546 break; … … 7549 7549 7550 7550 /* Line 1806 of yacc.c */ 7551 #line 184 4"parser.yy"7551 #line 1843 "parser.yy" 7552 7552 { (yyval.decl) = DeclarationNode::newFromTypeGen( (yyvsp[(1) - (4)].tok), (yyvsp[(3) - (4)].en) ); } 7553 7553 break; … … 7556 7556 7557 7557 /* Line 1806 of yacc.c */ 7558 #line 18 50"parser.yy"7558 #line 1849 "parser.yy" 7559 7559 { (yyval.decl) = (yyvsp[(1) - (4)].decl)->appendList( (yyvsp[(3) - (4)].decl) ); } 7560 7560 break; … … 7563 7563 7564 7564 /* Line 1806 of yacc.c */ 7565 #line 185 5"parser.yy"7565 #line 1854 "parser.yy" 7566 7566 { typedefTable.addToEnclosingScope( *(yyvsp[(2) - (2)].tok), TypedefTable::TD ); } 7567 7567 break; … … 7570 7570 7571 7571 /* Line 1806 of yacc.c */ 7572 #line 185 7"parser.yy"7572 #line 1856 "parser.yy" 7573 7573 { (yyval.decl) = DeclarationNode::newTypeParam( (yyvsp[(1) - (4)].tclass), (yyvsp[(2) - (4)].tok) )->addAssertions( (yyvsp[(4) - (4)].decl) ); } 7574 7574 break; … … 7577 7577 7578 7578 /* Line 1806 of yacc.c */ 7579 #line 186 3"parser.yy"7579 #line 1862 "parser.yy" 7580 7580 { (yyval.tclass) = DeclarationNode::Otype; } 7581 7581 break; … … 7584 7584 7585 7585 /* Line 1806 of yacc.c */ 7586 #line 186 5"parser.yy"7586 #line 1864 "parser.yy" 7587 7587 { (yyval.tclass) = DeclarationNode::Ftype; } 7588 7588 break; … … 7591 7591 7592 7592 /* Line 1806 of yacc.c */ 7593 #line 186 7"parser.yy"7593 #line 1866 "parser.yy" 7594 7594 { (yyval.tclass) = DeclarationNode::Dtype; } 7595 7595 break; … … 7598 7598 7599 7599 /* Line 1806 of yacc.c */ 7600 #line 187 2"parser.yy"7600 #line 1871 "parser.yy" 7601 7601 { (yyval.decl) = 0; } 7602 7602 break; … … 7605 7605 7606 7606 /* Line 1806 of yacc.c */ 7607 #line 187 4"parser.yy"7607 #line 1873 "parser.yy" 7608 7608 { (yyval.decl) = (yyvsp[(1) - (2)].decl) != 0 ? (yyvsp[(1) - (2)].decl)->appendList( (yyvsp[(2) - (2)].decl) ) : (yyvsp[(2) - (2)].decl); } 7609 7609 break; … … 7612 7612 7613 7613 /* Line 1806 of yacc.c */ 7614 #line 187 9"parser.yy"7614 #line 1878 "parser.yy" 7615 7615 { 7616 7616 typedefTable.openTrait( *(yyvsp[(2) - (5)].tok) ); … … 7622 7622 7623 7623 /* Line 1806 of yacc.c */ 7624 #line 188 4"parser.yy"7624 #line 1883 "parser.yy" 7625 7625 { (yyval.decl) = (yyvsp[(4) - (5)].decl); } 7626 7626 break; … … 7629 7629 7630 7630 /* Line 1806 of yacc.c */ 7631 #line 188 6"parser.yy"7631 #line 1885 "parser.yy" 7632 7632 { (yyval.decl) = 0; } 7633 7633 break; … … 7636 7636 7637 7637 /* Line 1806 of yacc.c */ 7638 #line 189 1"parser.yy"7638 #line 1890 "parser.yy" 7639 7639 { (yyval.en) = new ExpressionNode( build_typevalue( (yyvsp[(1) - (1)].decl) ) ); } 7640 7640 break; … … 7643 7643 7644 7644 /* Line 1806 of yacc.c */ 7645 #line 189 4"parser.yy"7645 #line 1893 "parser.yy" 7646 7646 { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (3)].en)->set_last( new ExpressionNode( build_typevalue( (yyvsp[(3) - (3)].decl) ) ) ) ); } 7647 7647 break; … … 7650 7650 7651 7651 /* Line 1806 of yacc.c */ 7652 #line 189 6"parser.yy"7652 #line 1895 "parser.yy" 7653 7653 { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (3)].en)->set_last( (yyvsp[(3) - (3)].en) )); } 7654 7654 break; … … 7657 7657 7658 7658 /* Line 1806 of yacc.c */ 7659 #line 190 1"parser.yy"7659 #line 1900 "parser.yy" 7660 7660 { (yyval.decl) = (yyvsp[(2) - (2)].decl); } 7661 7661 break; … … 7664 7664 7665 7665 /* Line 1806 of yacc.c */ 7666 #line 190 3"parser.yy"7666 #line 1902 "parser.yy" 7667 7667 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addQualifiers( (yyvsp[(1) - (3)].decl) ); } 7668 7668 break; … … 7671 7671 7672 7672 /* Line 1806 of yacc.c */ 7673 #line 190 5"parser.yy"7673 #line 1904 "parser.yy" 7674 7674 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl)->copyStorageClasses( (yyvsp[(1) - (3)].decl) ) ); } 7675 7675 break; … … 7678 7678 7679 7679 /* Line 1806 of yacc.c */ 7680 #line 19 10"parser.yy"7680 #line 1909 "parser.yy" 7681 7681 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addAssertions( (yyvsp[(2) - (2)].decl) ); } 7682 7682 break; … … 7685 7685 7686 7686 /* Line 1806 of yacc.c */ 7687 #line 191 2"parser.yy"7687 #line 1911 "parser.yy" 7688 7688 { (yyval.decl) = (yyvsp[(1) - (4)].decl)->addAssertions( (yyvsp[(2) - (4)].decl) )->addType( (yyvsp[(4) - (4)].decl) ); } 7689 7689 break; … … 7692 7692 7693 7693 /* Line 1806 of yacc.c */ 7694 #line 191 7"parser.yy"7694 #line 1916 "parser.yy" 7695 7695 { 7696 7696 typedefTable.addToEnclosingScope( *(yyvsp[(1) - (1)].tok), TypedefTable::TD ); … … 7702 7702 7703 7703 /* Line 1806 of yacc.c */ 7704 #line 192 2"parser.yy"7704 #line 1921 "parser.yy" 7705 7705 { 7706 7706 typedefTable.addToEnclosingScope( *(yyvsp[(1) - (6)].tok), TypedefTable::TG ); … … 7712 7712 7713 7713 /* Line 1806 of yacc.c */ 7714 #line 19 30"parser.yy"7714 #line 1929 "parser.yy" 7715 7715 { 7716 7716 typedefTable.addToEnclosingScope( *(yyvsp[(2) - (9)].tok), TypedefTable::ID ); … … 7722 7722 7723 7723 /* Line 1806 of yacc.c */ 7724 #line 193 5"parser.yy"7724 #line 1934 "parser.yy" 7725 7725 { 7726 7726 typedefTable.enterTrait( *(yyvsp[(2) - (8)].tok) ); … … 7732 7732 7733 7733 /* Line 1806 of yacc.c */ 7734 #line 19 40"parser.yy"7734 #line 1939 "parser.yy" 7735 7735 { 7736 7736 typedefTable.leaveTrait(); … … 7743 7743 7744 7744 /* Line 1806 of yacc.c */ 7745 #line 19 50"parser.yy"7745 #line 1949 "parser.yy" 7746 7746 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ); } 7747 7747 break; … … 7750 7750 7751 7751 /* Line 1806 of yacc.c */ 7752 #line 19 60"parser.yy"7752 #line 1959 "parser.yy" 7753 7753 { 7754 7754 typedefTable.addToEnclosingScope2( TypedefTable::ID ); … … 7760 7760 7761 7761 /* Line 1806 of yacc.c */ 7762 #line 196 5"parser.yy"7762 #line 1964 "parser.yy" 7763 7763 { 7764 7764 typedefTable.addToEnclosingScope2( TypedefTable::ID ); … … 7770 7770 7771 7771 /* Line 1806 of yacc.c */ 7772 #line 19 70"parser.yy"7772 #line 1969 "parser.yy" 7773 7773 { 7774 7774 typedefTable.addToEnclosingScope2( *(yyvsp[(5) - (5)].tok), TypedefTable::ID ); … … 7780 7780 7781 7781 /* Line 1806 of yacc.c */ 7782 #line 197 8"parser.yy"7782 #line 1977 "parser.yy" 7783 7783 { 7784 7784 typedefTable.addToEnclosingScope2( TypedefTable::ID ); … … 7790 7790 7791 7791 /* Line 1806 of yacc.c */ 7792 #line 198 3"parser.yy"7792 #line 1982 "parser.yy" 7793 7793 { 7794 7794 typedefTable.addToEnclosingScope2( TypedefTable::ID ); … … 7800 7800 7801 7801 /* Line 1806 of yacc.c */ 7802 #line 199 3"parser.yy"7802 #line 1992 "parser.yy" 7803 7803 {} 7804 7804 break; … … 7807 7807 7808 7808 /* Line 1806 of yacc.c */ 7809 #line 199 5"parser.yy"7809 #line 1994 "parser.yy" 7810 7810 { parseTree = parseTree != nullptr ? parseTree->appendList( (yyvsp[(1) - (1)].decl) ) : (yyvsp[(1) - (1)].decl); } 7811 7811 break; … … 7814 7814 7815 7815 /* Line 1806 of yacc.c */ 7816 #line 200 1"parser.yy"7816 #line 2000 "parser.yy" 7817 7817 { (yyval.decl) = (yyvsp[(1) - (3)].decl) != nullptr ? (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ) : (yyvsp[(3) - (3)].decl); } 7818 7818 break; … … 7821 7821 7822 7822 /* Line 1806 of yacc.c */ 7823 #line 200 6"parser.yy"7823 #line 2005 "parser.yy" 7824 7824 { (yyval.decl) = 0; } 7825 7825 break; … … 7828 7828 7829 7829 /* Line 1806 of yacc.c */ 7830 #line 201 4"parser.yy"7830 #line 2013 "parser.yy" 7831 7831 {} 7832 7832 break; … … 7835 7835 7836 7836 /* Line 1806 of yacc.c */ 7837 #line 201 6"parser.yy"7837 #line 2015 "parser.yy" 7838 7838 { 7839 7839 linkageStack.push( linkage ); // handle nested extern "C"/"Cforall" … … 7845 7845 7846 7846 /* Line 1806 of yacc.c */ 7847 #line 202 1"parser.yy"7847 #line 2020 "parser.yy" 7848 7848 { 7849 7849 linkage = linkageStack.top(); … … 7856 7856 7857 7857 /* Line 1806 of yacc.c */ 7858 #line 202 7"parser.yy"7858 #line 2026 "parser.yy" 7859 7859 { // mark all fields in list 7860 7860 for ( DeclarationNode *iter = (yyvsp[(2) - (2)].decl); iter != nullptr; iter = (DeclarationNode *)iter->get_next() ) … … 7867 7867 7868 7868 /* Line 1806 of yacc.c */ 7869 #line 204 2"parser.yy"7869 #line 2041 "parser.yy" 7870 7870 { 7871 7871 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7878 7878 7879 7879 /* Line 1806 of yacc.c */ 7880 #line 204 8"parser.yy"7880 #line 2047 "parser.yy" 7881 7881 { 7882 7882 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7889 7889 7890 7890 /* Line 1806 of yacc.c */ 7891 #line 205 7"parser.yy"7891 #line 2056 "parser.yy" 7892 7892 { 7893 7893 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7900 7900 7901 7901 /* Line 1806 of yacc.c */ 7902 #line 206 3"parser.yy"7902 #line 2062 "parser.yy" 7903 7903 { 7904 7904 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7911 7911 7912 7912 /* Line 1806 of yacc.c */ 7913 #line 206 9"parser.yy"7913 #line 2068 "parser.yy" 7914 7914 { 7915 7915 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7922 7922 7923 7923 /* Line 1806 of yacc.c */ 7924 #line 207 5"parser.yy"7924 #line 2074 "parser.yy" 7925 7925 { 7926 7926 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7933 7933 7934 7934 /* Line 1806 of yacc.c */ 7935 #line 208 1"parser.yy"7935 #line 2080 "parser.yy" 7936 7936 { 7937 7937 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7944 7944 7945 7945 /* Line 1806 of yacc.c */ 7946 #line 208 9"parser.yy"7946 #line 2088 "parser.yy" 7947 7947 { 7948 7948 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7955 7955 7956 7956 /* Line 1806 of yacc.c */ 7957 #line 209 5"parser.yy"7957 #line 2094 "parser.yy" 7958 7958 { 7959 7959 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7966 7966 7967 7967 /* Line 1806 of yacc.c */ 7968 #line 210 3"parser.yy"7968 #line 2102 "parser.yy" 7969 7969 { 7970 7970 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7977 7977 7978 7978 /* Line 1806 of yacc.c */ 7979 #line 210 9"parser.yy"7979 #line 2108 "parser.yy" 7980 7980 { 7981 7981 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7988 7988 7989 7989 /* Line 1806 of yacc.c */ 7990 #line 212 4"parser.yy"7990 #line 2123 "parser.yy" 7991 7991 { (yyval.en) = new ExpressionNode( build_range( (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 7992 7992 break; … … 7995 7995 7996 7996 /* Line 1806 of yacc.c */ 7997 #line 212 9"parser.yy"7997 #line 2128 "parser.yy" 7998 7998 { delete (yyvsp[(3) - (5)].str); } 7999 7999 break; … … 8002 8002 8003 8003 /* Line 1806 of yacc.c */ 8004 #line 213 4"parser.yy"8004 #line 2133 "parser.yy" 8005 8005 { (yyval.decl) = 0; } 8006 8006 break; … … 8009 8009 8010 8010 /* Line 1806 of yacc.c */ 8011 #line 214 1"parser.yy"8011 #line 2140 "parser.yy" 8012 8012 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 8013 8013 break; … … 8016 8016 8017 8017 /* Line 1806 of yacc.c */ 8018 #line 214 7"parser.yy"8018 #line 2146 "parser.yy" 8019 8019 { (yyval.decl) = 0; } 8020 8020 break; … … 8023 8023 8024 8024 /* Line 1806 of yacc.c */ 8025 #line 215 8"parser.yy"8025 #line 2157 "parser.yy" 8026 8026 { delete (yyvsp[(3) - (4)].en); } 8027 8027 break; … … 8030 8030 8031 8031 /* Line 1806 of yacc.c */ 8032 #line 2161 "parser.yy" 8033 { delete (yyvsp[(1) - (1)].tok); } 8034 break; 8035 8036 case 560: 8037 8038 /* Line 1806 of yacc.c */ 8032 8039 #line 2162 "parser.yy" 8033 { delete (yyvsp[(1) - (1)]. tok); }8034 break; 8035 8036 case 56 0:8040 { delete (yyvsp[(1) - (1)].decl); } 8041 break; 8042 8043 case 561: 8037 8044 8038 8045 /* Line 1806 of yacc.c */ … … 8041 8048 break; 8042 8049 8043 case 56 1:8050 case 562: 8044 8051 8045 8052 /* Line 1806 of yacc.c */ … … 8048 8055 break; 8049 8056 8050 case 562:8051 8052 /* Line 1806 of yacc.c */8053 #line 2165 "parser.yy"8054 { delete (yyvsp[(1) - (1)].decl); }8055 break;8056 8057 8057 case 563: 8058 8058 8059 8059 /* Line 1806 of yacc.c */ 8060 #line 2 200"parser.yy"8060 #line 2199 "parser.yy" 8061 8061 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8062 8062 break; … … 8065 8065 8066 8066 /* Line 1806 of yacc.c */ 8067 #line 220 3"parser.yy"8067 #line 2202 "parser.yy" 8068 8068 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8069 8069 break; … … 8072 8072 8073 8073 /* Line 1806 of yacc.c */ 8074 #line 220 5"parser.yy"8074 #line 2204 "parser.yy" 8075 8075 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8076 8076 break; … … 8079 8079 8080 8080 /* Line 1806 of yacc.c */ 8081 #line 22 10"parser.yy"8081 #line 2209 "parser.yy" 8082 8082 { 8083 8083 typedefTable.setNextIdentifier( *(yyvsp[(1) - (1)].tok) ); … … 8089 8089 8090 8090 /* Line 1806 of yacc.c */ 8091 #line 221 5"parser.yy"8091 #line 2214 "parser.yy" 8092 8092 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8093 8093 break; … … 8096 8096 8097 8097 /* Line 1806 of yacc.c */ 8098 #line 22 20"parser.yy"8098 #line 2219 "parser.yy" 8099 8099 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8100 8100 break; … … 8103 8103 8104 8104 /* Line 1806 of yacc.c */ 8105 #line 222 2"parser.yy"8105 #line 2221 "parser.yy" 8106 8106 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8107 8107 break; … … 8110 8110 8111 8111 /* Line 1806 of yacc.c */ 8112 #line 222 4"parser.yy"8112 #line 2223 "parser.yy" 8113 8113 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8114 8114 break; … … 8117 8117 8118 8118 /* Line 1806 of yacc.c */ 8119 #line 222 9"parser.yy"8119 #line 2228 "parser.yy" 8120 8120 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); } 8121 8121 break; … … 8124 8124 8125 8125 /* Line 1806 of yacc.c */ 8126 #line 223 1"parser.yy"8126 #line 2230 "parser.yy" 8127 8127 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8128 8128 break; … … 8131 8131 8132 8132 /* Line 1806 of yacc.c */ 8133 #line 223 3"parser.yy"8133 #line 2232 "parser.yy" 8134 8134 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8135 8135 break; … … 8138 8138 8139 8139 /* Line 1806 of yacc.c */ 8140 #line 223 5"parser.yy"8140 #line 2234 "parser.yy" 8141 8141 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8142 8142 break; … … 8145 8145 8146 8146 /* Line 1806 of yacc.c */ 8147 #line 22 40"parser.yy"8147 #line 2239 "parser.yy" 8148 8148 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8149 8149 break; … … 8152 8152 8153 8153 /* Line 1806 of yacc.c */ 8154 #line 224 2"parser.yy"8154 #line 2241 "parser.yy" 8155 8155 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8156 8156 break; … … 8159 8159 8160 8160 /* Line 1806 of yacc.c */ 8161 #line 225 1"parser.yy"8161 #line 2250 "parser.yy" 8162 8162 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8163 8163 break; … … 8166 8166 8167 8167 /* Line 1806 of yacc.c */ 8168 #line 225 4"parser.yy"8168 #line 2253 "parser.yy" 8169 8169 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8170 8170 break; … … 8173 8173 8174 8174 /* Line 1806 of yacc.c */ 8175 #line 225 9"parser.yy"8175 #line 2258 "parser.yy" 8176 8176 { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); } 8177 8177 break; … … 8180 8180 8181 8181 /* Line 1806 of yacc.c */ 8182 #line 226 1"parser.yy"8182 #line 2260 "parser.yy" 8183 8183 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8184 8184 break; … … 8187 8187 8188 8188 /* Line 1806 of yacc.c */ 8189 #line 226 3"parser.yy"8189 #line 2262 "parser.yy" 8190 8190 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8191 8191 break; … … 8194 8194 8195 8195 /* Line 1806 of yacc.c */ 8196 #line 226 8"parser.yy"8196 #line 2267 "parser.yy" 8197 8197 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8198 8198 break; … … 8201 8201 8202 8202 /* Line 1806 of yacc.c */ 8203 #line 22 70"parser.yy"8203 #line 2269 "parser.yy" 8204 8204 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8205 8205 break; … … 8208 8208 8209 8209 /* Line 1806 of yacc.c */ 8210 #line 227 2"parser.yy"8210 #line 2271 "parser.yy" 8211 8211 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8212 8212 break; … … 8215 8215 8216 8216 /* Line 1806 of yacc.c */ 8217 #line 227 7"parser.yy"8217 #line 2276 "parser.yy" 8218 8218 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8219 8219 break; … … 8222 8222 8223 8223 /* Line 1806 of yacc.c */ 8224 #line 227 9"parser.yy"8224 #line 2278 "parser.yy" 8225 8225 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8226 8226 break; … … 8229 8229 8230 8230 /* Line 1806 of yacc.c */ 8231 #line 228 1"parser.yy"8231 #line 2280 "parser.yy" 8232 8232 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8233 8233 break; … … 8236 8236 8237 8237 /* Line 1806 of yacc.c */ 8238 #line 229 6"parser.yy"8238 #line 2295 "parser.yy" 8239 8239 { (yyval.decl) = (yyvsp[(1) - (4)].decl)->addIdList( (yyvsp[(3) - (4)].decl) ); } 8240 8240 break; … … 8243 8243 8244 8244 /* Line 1806 of yacc.c */ 8245 #line 229 8"parser.yy"8245 #line 2297 "parser.yy" 8246 8246 { (yyval.decl) = (yyvsp[(2) - (6)].decl)->addIdList( (yyvsp[(5) - (6)].decl) ); } 8247 8247 break; … … 8250 8250 8251 8251 /* Line 1806 of yacc.c */ 8252 #line 2 300"parser.yy"8252 #line 2299 "parser.yy" 8253 8253 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8254 8254 break; … … 8257 8257 8258 8258 /* Line 1806 of yacc.c */ 8259 #line 230 5"parser.yy"8259 #line 2304 "parser.yy" 8260 8260 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8261 8261 break; … … 8264 8264 8265 8265 /* Line 1806 of yacc.c */ 8266 #line 230 7"parser.yy"8266 #line 2306 "parser.yy" 8267 8267 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8268 8268 break; … … 8271 8271 8272 8272 /* Line 1806 of yacc.c */ 8273 #line 230 9"parser.yy"8273 #line 2308 "parser.yy" 8274 8274 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8275 8275 break; … … 8278 8278 8279 8279 /* Line 1806 of yacc.c */ 8280 #line 231 4"parser.yy"8280 #line 2313 "parser.yy" 8281 8281 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8282 8282 break; … … 8285 8285 8286 8286 /* Line 1806 of yacc.c */ 8287 #line 231 6"parser.yy"8287 #line 2315 "parser.yy" 8288 8288 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8289 8289 break; … … 8292 8292 8293 8293 /* Line 1806 of yacc.c */ 8294 #line 231 8"parser.yy"8294 #line 2317 "parser.yy" 8295 8295 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8296 8296 break; … … 8299 8299 8300 8300 /* Line 1806 of yacc.c */ 8301 #line 233 3"parser.yy"8301 #line 2332 "parser.yy" 8302 8302 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8303 8303 break; … … 8306 8306 8307 8307 /* Line 1806 of yacc.c */ 8308 #line 233 6"parser.yy"8308 #line 2335 "parser.yy" 8309 8309 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8310 8310 break; … … 8313 8313 8314 8314 /* Line 1806 of yacc.c */ 8315 #line 233 8"parser.yy"8315 #line 2337 "parser.yy" 8316 8316 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8317 8317 break; … … 8320 8320 8321 8321 /* Line 1806 of yacc.c */ 8322 #line 234 4"parser.yy"8322 #line 2343 "parser.yy" 8323 8323 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8324 8324 break; … … 8327 8327 8328 8328 /* Line 1806 of yacc.c */ 8329 #line 234 9"parser.yy"8329 #line 2348 "parser.yy" 8330 8330 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8331 8331 break; … … 8334 8334 8335 8335 /* Line 1806 of yacc.c */ 8336 #line 235 1"parser.yy"8336 #line 2350 "parser.yy" 8337 8337 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8338 8338 break; … … 8341 8341 8342 8342 /* Line 1806 of yacc.c */ 8343 #line 235 3"parser.yy"8343 #line 2352 "parser.yy" 8344 8344 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8345 8345 break; … … 8348 8348 8349 8349 /* Line 1806 of yacc.c */ 8350 #line 235 8"parser.yy"8350 #line 2357 "parser.yy" 8351 8351 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); } 8352 8352 break; … … 8355 8355 8356 8356 /* Line 1806 of yacc.c */ 8357 #line 23 60"parser.yy"8357 #line 2359 "parser.yy" 8358 8358 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8359 8359 break; … … 8362 8362 8363 8363 /* Line 1806 of yacc.c */ 8364 #line 236 2"parser.yy"8364 #line 2361 "parser.yy" 8365 8365 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8366 8366 break; … … 8369 8369 8370 8370 /* Line 1806 of yacc.c */ 8371 #line 236 4"parser.yy"8371 #line 2363 "parser.yy" 8372 8372 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8373 8373 break; … … 8376 8376 8377 8377 /* Line 1806 of yacc.c */ 8378 #line 236 9"parser.yy"8378 #line 2368 "parser.yy" 8379 8379 { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); } 8380 8380 break; … … 8383 8383 8384 8384 /* Line 1806 of yacc.c */ 8385 #line 237 1"parser.yy"8385 #line 2370 "parser.yy" 8386 8386 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8387 8387 break; … … 8390 8390 8391 8391 /* Line 1806 of yacc.c */ 8392 #line 237 3"parser.yy"8392 #line 2372 "parser.yy" 8393 8393 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8394 8394 break; … … 8397 8397 8398 8398 /* Line 1806 of yacc.c */ 8399 #line 238 3"parser.yy"8399 #line 2382 "parser.yy" 8400 8400 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8401 8401 break; … … 8404 8404 8405 8405 /* Line 1806 of yacc.c */ 8406 #line 238 6"parser.yy"8406 #line 2385 "parser.yy" 8407 8407 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8408 8408 break; … … 8411 8411 8412 8412 /* Line 1806 of yacc.c */ 8413 #line 238 8"parser.yy"8413 #line 2387 "parser.yy" 8414 8414 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8415 8415 break; … … 8418 8418 8419 8419 /* Line 1806 of yacc.c */ 8420 #line 239 3"parser.yy"8420 #line 2392 "parser.yy" 8421 8421 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8422 8422 break; … … 8425 8425 8426 8426 /* Line 1806 of yacc.c */ 8427 #line 239 5"parser.yy"8427 #line 2394 "parser.yy" 8428 8428 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8429 8429 break; … … 8432 8432 8433 8433 /* Line 1806 of yacc.c */ 8434 #line 239 7"parser.yy"8434 #line 2396 "parser.yy" 8435 8435 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8436 8436 break; … … 8439 8439 8440 8440 /* Line 1806 of yacc.c */ 8441 #line 240 2"parser.yy"8441 #line 2401 "parser.yy" 8442 8442 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); } 8443 8443 break; … … 8446 8446 8447 8447 /* Line 1806 of yacc.c */ 8448 #line 240 4"parser.yy"8448 #line 2403 "parser.yy" 8449 8449 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8450 8450 break; … … 8453 8453 8454 8454 /* Line 1806 of yacc.c */ 8455 #line 240 6"parser.yy"8455 #line 2405 "parser.yy" 8456 8456 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8457 8457 break; … … 8460 8460 8461 8461 /* Line 1806 of yacc.c */ 8462 #line 240 8"parser.yy"8462 #line 2407 "parser.yy" 8463 8463 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8464 8464 break; … … 8467 8467 8468 8468 /* Line 1806 of yacc.c */ 8469 #line 241 3"parser.yy"8469 #line 2412 "parser.yy" 8470 8470 { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); } 8471 8471 break; … … 8474 8474 8475 8475 /* Line 1806 of yacc.c */ 8476 #line 241 5"parser.yy"8476 #line 2414 "parser.yy" 8477 8477 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8478 8478 break; … … 8481 8481 8482 8482 /* Line 1806 of yacc.c */ 8483 #line 241 7"parser.yy"8483 #line 2416 "parser.yy" 8484 8484 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8485 8485 break; … … 8488 8488 8489 8489 /* Line 1806 of yacc.c */ 8490 #line 244 8"parser.yy"8490 #line 2447 "parser.yy" 8491 8491 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8492 8492 break; … … 8495 8495 8496 8496 /* Line 1806 of yacc.c */ 8497 #line 245 1"parser.yy"8497 #line 2450 "parser.yy" 8498 8498 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8499 8499 break; … … 8502 8502 8503 8503 /* Line 1806 of yacc.c */ 8504 #line 245 3"parser.yy"8504 #line 2452 "parser.yy" 8505 8505 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8506 8506 break; … … 8509 8509 8510 8510 /* Line 1806 of yacc.c */ 8511 #line 245 8"parser.yy"8511 #line 2457 "parser.yy" 8512 8512 { 8513 8513 typedefTable.setNextIdentifier( *(yyvsp[(1) - (1)].tok) ); … … 8519 8519 8520 8520 /* Line 1806 of yacc.c */ 8521 #line 246 3"parser.yy"8521 #line 2462 "parser.yy" 8522 8522 { 8523 8523 typedefTable.setNextIdentifier( *(yyvsp[(1) - (1)].tok) ); … … 8529 8529 8530 8530 /* Line 1806 of yacc.c */ 8531 #line 247 1"parser.yy"8531 #line 2470 "parser.yy" 8532 8532 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8533 8533 break; … … 8536 8536 8537 8537 /* Line 1806 of yacc.c */ 8538 #line 247 3"parser.yy"8538 #line 2472 "parser.yy" 8539 8539 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8540 8540 break; … … 8543 8543 8544 8544 /* Line 1806 of yacc.c */ 8545 #line 247 5"parser.yy"8545 #line 2474 "parser.yy" 8546 8546 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8547 8547 break; … … 8550 8550 8551 8551 /* Line 1806 of yacc.c */ 8552 #line 24 80"parser.yy"8552 #line 2479 "parser.yy" 8553 8553 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); } 8554 8554 break; … … 8557 8557 8558 8558 /* Line 1806 of yacc.c */ 8559 #line 248 2"parser.yy"8559 #line 2481 "parser.yy" 8560 8560 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8561 8561 break; … … 8564 8564 8565 8565 /* Line 1806 of yacc.c */ 8566 #line 248 7"parser.yy"8566 #line 2486 "parser.yy" 8567 8567 { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); } 8568 8568 break; … … 8571 8571 8572 8572 /* Line 1806 of yacc.c */ 8573 #line 248 9"parser.yy"8573 #line 2488 "parser.yy" 8574 8574 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8575 8575 break; … … 8578 8578 8579 8579 /* Line 1806 of yacc.c */ 8580 #line 250 4"parser.yy"8580 #line 2503 "parser.yy" 8581 8581 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8582 8582 break; … … 8585 8585 8586 8586 /* Line 1806 of yacc.c */ 8587 #line 250 6"parser.yy"8587 #line 2505 "parser.yy" 8588 8588 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8589 8589 break; … … 8592 8592 8593 8593 /* Line 1806 of yacc.c */ 8594 #line 251 1"parser.yy"8594 #line 2510 "parser.yy" 8595 8595 { (yyval.decl) = DeclarationNode::newPointer( 0 ); } 8596 8596 break; … … 8599 8599 8600 8600 /* Line 1806 of yacc.c */ 8601 #line 251 3"parser.yy"8601 #line 2512 "parser.yy" 8602 8602 { (yyval.decl) = DeclarationNode::newPointer( (yyvsp[(2) - (2)].decl) ); } 8603 8603 break; … … 8606 8606 8607 8607 /* Line 1806 of yacc.c */ 8608 #line 251 5"parser.yy"8608 #line 2514 "parser.yy" 8609 8609 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8610 8610 break; … … 8613 8613 8614 8614 /* Line 1806 of yacc.c */ 8615 #line 251 7"parser.yy"8615 #line 2516 "parser.yy" 8616 8616 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8617 8617 break; … … 8620 8620 8621 8621 /* Line 1806 of yacc.c */ 8622 #line 251 9"parser.yy"8622 #line 2518 "parser.yy" 8623 8623 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8624 8624 break; … … 8627 8627 8628 8628 /* Line 1806 of yacc.c */ 8629 #line 252 5"parser.yy"8629 #line 2524 "parser.yy" 8630 8630 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8631 8631 break; … … 8634 8634 8635 8635 /* Line 1806 of yacc.c */ 8636 #line 252 7"parser.yy"8636 #line 2526 "parser.yy" 8637 8637 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8638 8638 break; … … 8641 8641 8642 8642 /* Line 1806 of yacc.c */ 8643 #line 252 9"parser.yy"8643 #line 2528 "parser.yy" 8644 8644 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8645 8645 break; … … 8648 8648 8649 8649 /* Line 1806 of yacc.c */ 8650 #line 253 4"parser.yy"8650 #line 2533 "parser.yy" 8651 8651 { (yyval.decl) = DeclarationNode::newFunction( nullptr, nullptr, (yyvsp[(3) - (5)].decl), nullptr ); } 8652 8652 break; … … 8655 8655 8656 8656 /* Line 1806 of yacc.c */ 8657 #line 253 6"parser.yy"8657 #line 2535 "parser.yy" 8658 8658 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8659 8659 break; … … 8662 8662 8663 8663 /* Line 1806 of yacc.c */ 8664 #line 253 8"parser.yy"8664 #line 2537 "parser.yy" 8665 8665 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8666 8666 break; … … 8669 8669 8670 8670 /* Line 1806 of yacc.c */ 8671 #line 254 4"parser.yy"8671 #line 2543 "parser.yy" 8672 8672 { (yyval.decl) = DeclarationNode::newArray( 0, 0, false ); } 8673 8673 break; … … 8676 8676 8677 8677 /* Line 1806 of yacc.c */ 8678 #line 254 6"parser.yy"8678 #line 2545 "parser.yy" 8679 8679 { (yyval.decl) = DeclarationNode::newArray( 0, 0, false )->addArray( (yyvsp[(3) - (3)].decl) ); } 8680 8680 break; … … 8683 8683 8684 8684 /* Line 1806 of yacc.c */ 8685 #line 255 2"parser.yy"8685 #line 2551 "parser.yy" 8686 8686 { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(3) - (5)].en), 0, false ); } 8687 8687 break; … … 8690 8690 8691 8691 /* Line 1806 of yacc.c */ 8692 #line 255 4"parser.yy"8692 #line 2553 "parser.yy" 8693 8693 { (yyval.decl) = DeclarationNode::newVarArray( 0 ); } 8694 8694 break; … … 8697 8697 8698 8698 /* Line 1806 of yacc.c */ 8699 #line 255 6"parser.yy"8699 #line 2555 "parser.yy" 8700 8700 { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addArray( DeclarationNode::newArray( (yyvsp[(4) - (6)].en), 0, false ) ); } 8701 8701 break; … … 8704 8704 8705 8705 /* Line 1806 of yacc.c */ 8706 #line 255 8"parser.yy"8706 #line 2557 "parser.yy" 8707 8707 { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addArray( DeclarationNode::newVarArray( 0 ) ); } 8708 8708 break; … … 8711 8711 8712 8712 /* Line 1806 of yacc.c */ 8713 #line 257 3"parser.yy"8713 #line 2572 "parser.yy" 8714 8714 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8715 8715 break; … … 8718 8718 8719 8719 /* Line 1806 of yacc.c */ 8720 #line 257 5"parser.yy"8720 #line 2574 "parser.yy" 8721 8721 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8722 8722 break; … … 8725 8725 8726 8726 /* Line 1806 of yacc.c */ 8727 #line 25 80"parser.yy"8727 #line 2579 "parser.yy" 8728 8728 { (yyval.decl) = DeclarationNode::newPointer( 0 ); } 8729 8729 break; … … 8732 8732 8733 8733 /* Line 1806 of yacc.c */ 8734 #line 258 2"parser.yy"8734 #line 2581 "parser.yy" 8735 8735 { (yyval.decl) = DeclarationNode::newPointer( (yyvsp[(2) - (2)].decl) ); } 8736 8736 break; … … 8739 8739 8740 8740 /* Line 1806 of yacc.c */ 8741 #line 258 4"parser.yy"8741 #line 2583 "parser.yy" 8742 8742 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8743 8743 break; … … 8746 8746 8747 8747 /* Line 1806 of yacc.c */ 8748 #line 258 6"parser.yy"8748 #line 2585 "parser.yy" 8749 8749 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8750 8750 break; … … 8753 8753 8754 8754 /* Line 1806 of yacc.c */ 8755 #line 258 8"parser.yy"8755 #line 2587 "parser.yy" 8756 8756 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8757 8757 break; … … 8760 8760 8761 8761 /* Line 1806 of yacc.c */ 8762 #line 259 4"parser.yy"8762 #line 2593 "parser.yy" 8763 8763 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8764 8764 break; … … 8767 8767 8768 8768 /* Line 1806 of yacc.c */ 8769 #line 259 6"parser.yy"8769 #line 2595 "parser.yy" 8770 8770 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8771 8771 break; … … 8774 8774 8775 8775 /* Line 1806 of yacc.c */ 8776 #line 259 8"parser.yy"8776 #line 2597 "parser.yy" 8777 8777 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8778 8778 break; … … 8781 8781 8782 8782 /* Line 1806 of yacc.c */ 8783 #line 260 3"parser.yy"8783 #line 2602 "parser.yy" 8784 8784 { (yyval.decl) = DeclarationNode::newFunction( nullptr, nullptr, (yyvsp[(3) - (5)].decl), nullptr ); } 8785 8785 break; … … 8788 8788 8789 8789 /* Line 1806 of yacc.c */ 8790 #line 260 5"parser.yy"8790 #line 2604 "parser.yy" 8791 8791 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8792 8792 break; … … 8795 8795 8796 8796 /* Line 1806 of yacc.c */ 8797 #line 260 7"parser.yy"8797 #line 2606 "parser.yy" 8798 8798 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8799 8799 break; … … 8802 8802 8803 8803 /* Line 1806 of yacc.c */ 8804 #line 261 4"parser.yy"8804 #line 2613 "parser.yy" 8805 8805 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); } 8806 8806 break; … … 8809 8809 8810 8810 /* Line 1806 of yacc.c */ 8811 #line 262 5"parser.yy"8811 #line 2624 "parser.yy" 8812 8812 { (yyval.decl) = DeclarationNode::newArray( 0, 0, false ); } 8813 8813 break; … … 8816 8816 8817 8817 /* Line 1806 of yacc.c */ 8818 #line 262 8"parser.yy"8818 #line 2627 "parser.yy" 8819 8819 { (yyval.decl) = DeclarationNode::newVarArray( (yyvsp[(3) - (6)].decl) ); } 8820 8820 break; … … 8823 8823 8824 8824 /* Line 1806 of yacc.c */ 8825 #line 26 30"parser.yy"8825 #line 2629 "parser.yy" 8826 8826 { (yyval.decl) = DeclarationNode::newArray( 0, (yyvsp[(3) - (5)].decl), false ); } 8827 8827 break; … … 8830 8830 8831 8831 /* Line 1806 of yacc.c */ 8832 #line 263 3"parser.yy"8832 #line 2632 "parser.yy" 8833 8833 { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), false ); } 8834 8834 break; … … 8837 8837 8838 8838 /* Line 1806 of yacc.c */ 8839 #line 263 5"parser.yy"8839 #line 2634 "parser.yy" 8840 8840 { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(5) - (7)].en), (yyvsp[(4) - (7)].decl), true ); } 8841 8841 break; … … 8844 8844 8845 8845 /* Line 1806 of yacc.c */ 8846 #line 263 7"parser.yy"8846 #line 2636 "parser.yy" 8847 8847 { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(5) - (7)].en), (yyvsp[(3) - (7)].decl), true ); } 8848 8848 break; … … 8851 8851 8852 8852 /* Line 1806 of yacc.c */ 8853 #line 265 1"parser.yy"8853 #line 2650 "parser.yy" 8854 8854 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8855 8855 break; … … 8858 8858 8859 8859 /* Line 1806 of yacc.c */ 8860 #line 265 3"parser.yy"8860 #line 2652 "parser.yy" 8861 8861 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8862 8862 break; … … 8865 8865 8866 8866 /* Line 1806 of yacc.c */ 8867 #line 265 8"parser.yy"8867 #line 2657 "parser.yy" 8868 8868 { (yyval.decl) = DeclarationNode::newPointer( 0 ); } 8869 8869 break; … … 8872 8872 8873 8873 /* Line 1806 of yacc.c */ 8874 #line 26 60"parser.yy"8874 #line 2659 "parser.yy" 8875 8875 { (yyval.decl) = DeclarationNode::newPointer( (yyvsp[(2) - (2)].decl) ); } 8876 8876 break; … … 8879 8879 8880 8880 /* Line 1806 of yacc.c */ 8881 #line 266 2"parser.yy"8881 #line 2661 "parser.yy" 8882 8882 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8883 8883 break; … … 8886 8886 8887 8887 /* Line 1806 of yacc.c */ 8888 #line 266 4"parser.yy"8888 #line 2663 "parser.yy" 8889 8889 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8890 8890 break; … … 8893 8893 8894 8894 /* Line 1806 of yacc.c */ 8895 #line 266 6"parser.yy"8895 #line 2665 "parser.yy" 8896 8896 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8897 8897 break; … … 8900 8900 8901 8901 /* Line 1806 of yacc.c */ 8902 #line 267 2"parser.yy"8902 #line 2671 "parser.yy" 8903 8903 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8904 8904 break; … … 8907 8907 8908 8908 /* Line 1806 of yacc.c */ 8909 #line 267 4"parser.yy"8909 #line 2673 "parser.yy" 8910 8910 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8911 8911 break; … … 8914 8914 8915 8915 /* Line 1806 of yacc.c */ 8916 #line 267 6"parser.yy"8916 #line 2675 "parser.yy" 8917 8917 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8918 8918 break; … … 8921 8921 8922 8922 /* Line 1806 of yacc.c */ 8923 #line 268 1"parser.yy"8923 #line 2680 "parser.yy" 8924 8924 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8925 8925 break; … … 8928 8928 8929 8929 /* Line 1806 of yacc.c */ 8930 #line 268 3"parser.yy"8930 #line 2682 "parser.yy" 8931 8931 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8932 8932 break; … … 8935 8935 8936 8936 /* Line 1806 of yacc.c */ 8937 #line 269 3"parser.yy"8937 #line 2692 "parser.yy" 8938 8938 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 8939 8939 break; … … 8942 8942 8943 8943 /* Line 1806 of yacc.c */ 8944 #line 270 3"parser.yy"8944 #line 2702 "parser.yy" 8945 8945 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 8946 8946 break; … … 8949 8949 8950 8950 /* Line 1806 of yacc.c */ 8951 #line 270 5"parser.yy"8951 #line 2704 "parser.yy" 8952 8952 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); } 8953 8953 break; … … 8956 8956 8957 8957 /* Line 1806 of yacc.c */ 8958 #line 270 7"parser.yy"8958 #line 2706 "parser.yy" 8959 8959 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 8960 8960 break; … … 8963 8963 8964 8964 /* Line 1806 of yacc.c */ 8965 #line 270 9"parser.yy"8965 #line 2708 "parser.yy" 8966 8966 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); } 8967 8967 break; … … 8970 8970 8971 8971 /* Line 1806 of yacc.c */ 8972 #line 271 1"parser.yy"8972 #line 2710 "parser.yy" 8973 8973 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 8974 8974 break; … … 8977 8977 8978 8978 /* Line 1806 of yacc.c */ 8979 #line 271 3"parser.yy"8979 #line 2712 "parser.yy" 8980 8980 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); } 8981 8981 break; … … 8984 8984 8985 8985 /* Line 1806 of yacc.c */ 8986 #line 27 20"parser.yy"8986 #line 2719 "parser.yy" 8987 8987 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); } 8988 8988 break; … … 8991 8991 8992 8992 /* Line 1806 of yacc.c */ 8993 #line 272 2"parser.yy"8993 #line 2721 "parser.yy" 8994 8994 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); } 8995 8995 break; … … 8998 8998 8999 8999 /* Line 1806 of yacc.c */ 9000 #line 272 4"parser.yy"9000 #line 2723 "parser.yy" 9001 9001 { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); } 9002 9002 break; … … 9005 9005 9006 9006 /* Line 1806 of yacc.c */ 9007 #line 272 6"parser.yy"9007 #line 2725 "parser.yy" 9008 9008 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( (yyvsp[(2) - (3)].decl) )->addNewArray( (yyvsp[(1) - (3)].decl) ); } 9009 9009 break; … … 9012 9012 9013 9013 /* Line 1806 of yacc.c */ 9014 #line 272 8"parser.yy"9014 #line 2727 "parser.yy" 9015 9015 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); } 9016 9016 break; … … 9019 9019 9020 9020 /* Line 1806 of yacc.c */ 9021 #line 2729 "parser.yy" 9022 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); } 9023 break; 9024 9025 case 722: 9026 9027 /* Line 1806 of yacc.c */ 9021 9028 #line 2731 "parser.yy" 9022 { (yyval.decl) = (yyvsp[( 3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false) ); }9023 break; 9024 9025 case 72 2:9029 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); } 9030 break; 9031 9032 case 723: 9026 9033 9027 9034 /* Line 1806 of yacc.c */ 9028 9035 #line 2733 "parser.yy" 9036 { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); } 9037 break; 9038 9039 case 724: 9040 9041 /* Line 1806 of yacc.c */ 9042 #line 2735 "parser.yy" 9043 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( (yyvsp[(2) - (3)].decl) )->addNewArray( (yyvsp[(1) - (3)].decl) ); } 9044 break; 9045 9046 case 725: 9047 9048 /* Line 1806 of yacc.c */ 9049 #line 2737 "parser.yy" 9029 9050 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); } 9030 9051 break; 9031 9052 9032 case 723: 9033 9034 /* Line 1806 of yacc.c */ 9035 #line 2735 "parser.yy" 9036 { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); } 9037 break; 9038 9039 case 724: 9040 9041 /* Line 1806 of yacc.c */ 9042 #line 2737 "parser.yy" 9043 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( (yyvsp[(2) - (3)].decl) )->addNewArray( (yyvsp[(1) - (3)].decl) ); } 9044 break; 9045 9046 case 725: 9047 9048 /* Line 1806 of yacc.c */ 9049 #line 2739 "parser.yy" 9053 case 726: 9054 9055 /* Line 1806 of yacc.c */ 9056 #line 2742 "parser.yy" 9057 { (yyval.decl) = DeclarationNode::newVarArray( (yyvsp[(3) - (6)].decl) ); } 9058 break; 9059 9060 case 727: 9061 9062 /* Line 1806 of yacc.c */ 9063 #line 2744 "parser.yy" 9064 { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), false ); } 9065 break; 9066 9067 case 728: 9068 9069 /* Line 1806 of yacc.c */ 9070 #line 2749 "parser.yy" 9071 { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), true ); } 9072 break; 9073 9074 case 729: 9075 9076 /* Line 1806 of yacc.c */ 9077 #line 2751 "parser.yy" 9078 { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(5) - (7)].en), (yyvsp[(4) - (7)].decl)->addQualifiers( (yyvsp[(3) - (7)].decl) ), true ); } 9079 break; 9080 9081 case 731: 9082 9083 /* Line 1806 of yacc.c */ 9084 #line 2778 "parser.yy" 9085 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 9086 break; 9087 9088 case 735: 9089 9090 /* Line 1806 of yacc.c */ 9091 #line 2789 "parser.yy" 9092 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 9093 break; 9094 9095 case 736: 9096 9097 /* Line 1806 of yacc.c */ 9098 #line 2791 "parser.yy" 9099 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); } 9100 break; 9101 9102 case 737: 9103 9104 /* Line 1806 of yacc.c */ 9105 #line 2793 "parser.yy" 9106 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 9107 break; 9108 9109 case 738: 9110 9111 /* Line 1806 of yacc.c */ 9112 #line 2795 "parser.yy" 9113 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); } 9114 break; 9115 9116 case 739: 9117 9118 /* Line 1806 of yacc.c */ 9119 #line 2797 "parser.yy" 9120 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 9121 break; 9122 9123 case 740: 9124 9125 /* Line 1806 of yacc.c */ 9126 #line 2799 "parser.yy" 9127 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); } 9128 break; 9129 9130 case 741: 9131 9132 /* Line 1806 of yacc.c */ 9133 #line 2806 "parser.yy" 9134 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( nullptr, nullptr, false ) ); } 9135 break; 9136 9137 case 742: 9138 9139 /* Line 1806 of yacc.c */ 9140 #line 2808 "parser.yy" 9141 { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( nullptr, nullptr, false ) ); } 9142 break; 9143 9144 case 743: 9145 9146 /* Line 1806 of yacc.c */ 9147 #line 2810 "parser.yy" 9050 9148 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); } 9051 9149 break; 9052 9150 9053 case 726: 9054 9055 /* Line 1806 of yacc.c */ 9056 #line 2744 "parser.yy" 9057 { (yyval.decl) = DeclarationNode::newVarArray( (yyvsp[(3) - (6)].decl) ); } 9058 break; 9059 9060 case 727: 9061 9062 /* Line 1806 of yacc.c */ 9063 #line 2746 "parser.yy" 9064 { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), false ); } 9065 break; 9066 9067 case 728: 9068 9069 /* Line 1806 of yacc.c */ 9070 #line 2751 "parser.yy" 9071 { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), true ); } 9072 break; 9073 9074 case 729: 9075 9076 /* Line 1806 of yacc.c */ 9077 #line 2753 "parser.yy" 9078 { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(5) - (7)].en), (yyvsp[(4) - (7)].decl)->addQualifiers( (yyvsp[(3) - (7)].decl) ), true ); } 9079 break; 9080 9081 case 731: 9082 9083 /* Line 1806 of yacc.c */ 9084 #line 2780 "parser.yy" 9085 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 9086 break; 9087 9088 case 735: 9089 9090 /* Line 1806 of yacc.c */ 9091 #line 2791 "parser.yy" 9092 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 9093 break; 9094 9095 case 736: 9096 9097 /* Line 1806 of yacc.c */ 9098 #line 2793 "parser.yy" 9099 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); } 9100 break; 9101 9102 case 737: 9103 9104 /* Line 1806 of yacc.c */ 9105 #line 2795 "parser.yy" 9106 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 9107 break; 9108 9109 case 738: 9110 9111 /* Line 1806 of yacc.c */ 9112 #line 2797 "parser.yy" 9113 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); } 9114 break; 9115 9116 case 739: 9117 9118 /* Line 1806 of yacc.c */ 9119 #line 2799 "parser.yy" 9120 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 9121 break; 9122 9123 case 740: 9124 9125 /* Line 1806 of yacc.c */ 9126 #line 2801 "parser.yy" 9127 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); } 9128 break; 9129 9130 case 741: 9131 9132 /* Line 1806 of yacc.c */ 9133 #line 2808 "parser.yy" 9151 case 744: 9152 9153 /* Line 1806 of yacc.c */ 9154 #line 2812 "parser.yy" 9134 9155 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( nullptr, nullptr, false ) ); } 9135 9156 break; 9136 9157 9137 case 74 2:9138 9139 /* Line 1806 of yacc.c */ 9140 #line 281 0"parser.yy"9158 case 745: 9159 9160 /* Line 1806 of yacc.c */ 9161 #line 2814 "parser.yy" 9141 9162 { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( nullptr, nullptr, false ) ); } 9142 9163 break; 9143 9164 9144 case 74 3:9145 9146 /* Line 1806 of yacc.c */ 9147 #line 281 2"parser.yy"9165 case 746: 9166 9167 /* Line 1806 of yacc.c */ 9168 #line 2816 "parser.yy" 9148 9169 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); } 9149 9170 break; 9150 9171 9151 case 744:9152 9153 /* Line 1806 of yacc.c */9154 #line 2814 "parser.yy"9155 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( nullptr, nullptr, false ) ); }9156 break;9157 9158 case 745:9159 9160 /* Line 1806 of yacc.c */9161 #line 2816 "parser.yy"9162 { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( nullptr, nullptr, false ) ); }9163 break;9164 9165 case 746:9166 9167 /* Line 1806 of yacc.c */9168 #line 2818 "parser.yy"9169 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }9170 break;9171 9172 9172 case 747: 9173 9173 9174 9174 /* Line 1806 of yacc.c */ 9175 #line 282 3"parser.yy"9175 #line 2821 "parser.yy" 9176 9176 { (yyval.decl) = DeclarationNode::newTuple( (yyvsp[(3) - (5)].decl) ); } 9177 9177 break; … … 9180 9180 9181 9181 /* Line 1806 of yacc.c */ 9182 #line 2826 "parser.yy" 9183 { (yyval.decl) = DeclarationNode::newFunction( nullptr, DeclarationNode::newTuple( nullptr ), (yyvsp[(4) - (5)].decl), nullptr ); } 9184 break; 9185 9186 case 749: 9187 9188 /* Line 1806 of yacc.c */ 9182 9189 #line 2828 "parser.yy" 9183 { (yyval.decl) = DeclarationNode::newFunction( nullptr, DeclarationNode::newTuple( nullptr ), (yyvsp[(4) - (5)].decl), nullptr ); }9184 break; 9185 9186 case 7 49:9190 { (yyval.decl) = DeclarationNode::newFunction( nullptr, (yyvsp[(1) - (6)].decl), (yyvsp[(4) - (6)].decl), nullptr ); } 9191 break; 9192 9193 case 750: 9187 9194 9188 9195 /* Line 1806 of yacc.c */ … … 9191 9198 break; 9192 9199 9193 case 750:9194 9195 /* Line 1806 of yacc.c */9196 #line 2832 "parser.yy"9197 { (yyval.decl) = DeclarationNode::newFunction( nullptr, (yyvsp[(1) - (6)].decl), (yyvsp[(4) - (6)].decl), nullptr ); }9198 break;9199 9200 9200 case 753: 9201 9201 9202 9202 /* Line 1806 of yacc.c */ 9203 #line 2854 "parser.yy" 9204 { (yyval.en) = 0; } 9205 break; 9206 9207 case 754: 9208 9209 /* Line 1806 of yacc.c */ 9203 9210 #line 2856 "parser.yy" 9204 { (yyval.en) = 0; }9205 break;9206 9207 case 754:9208 9209 /* Line 1806 of yacc.c */9210 #line 2858 "parser.yy"9211 9211 { (yyval.en) = (yyvsp[(2) - (2)].en); } 9212 9212 break; … … 9446 9446 9447 9447 /* Line 2067 of yacc.c */ 9448 #line 28 61"parser.yy"9448 #line 2859 "parser.yy" 9449 9449 9450 9450 // ----end of grammar---- -
src/Parser/parser.yy
ra1e67dd rf0121d7 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Oct 19 22:19:33201613 // Update Count : 200 312 // Last Modified On : Wed Oct 5 14:10:46 2016 13 // Update Count : 2002 14 14 // 15 15 … … 277 277 // 278 278 // Cforall compounds this problem by introducing type names local to the scope of a declaration (for instance, those 279 // introduced through "forall" qualifiers), and by introducing "type generators" -- paramet erized types. This latter279 // introduced through "forall" qualifiers), and by introducing "type generators" -- parametrized types. This latter 280 280 // type name creates a third class of identifiers that must be distinguished by the scanner. 281 281 // 282 282 // Since the scanner cannot distinguish among the different classes of identifiers without some context information, it 283 // accesses a data structure ( TypedefTable) to allow classification of an identifier that it has just read. Semantic284 // actions during the parser update this data structure when the class of identifiers change.283 // accesses a data structure (the TypedefTable) to allow classification of an identifier that it has just read. 284 // Semantic actions during the parser update this data structure when the class of identifiers change. 285 285 // 286 286 // Because the Cforall language is block-scoped, there is the possibility that an identifier can change its class in a … … 288 288 // particular declaration, each declaration is itself a scope. This requires distinguishing between type names that are 289 289 // local to the current declaration scope and those that persist past the end of the declaration (i.e., names defined in 290 // "typedef" or " otype" declarations).290 // "typedef" or "type" declarations). 291 291 // 292 292 // The non-terminals "push" and "pop" derive the empty string; their only use is to denote the opening and closing of … … 433 433 no_attr_identifier 434 434 { $$ = new ExpressionNode( build_varref( $1 ) ); } 435 // x.1, x.[0, 0.0]436 435 | INTEGERconstant 437 436 { $$ = new ExpressionNode( build_constantInteger( *$1 ) ); } … … 2727 2726 | multi_array_dimension type_specifier 2728 2727 { $$ = $2->addNewArray( $1 ); } 2729 2730 2728 | '[' ']' new_identifier_parameter_ptr 2731 2729 { $$ = $3->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
Note:
See TracChangeset
for help on using the changeset viewer.