From a147c8cdcaa82026dc1540cd43e3a4c41996214d Mon Sep 17 00:00:00 2001 From: Ayrton Chilibeck Date: Fri, 5 Dec 2025 15:45:18 -0700 Subject: [PATCH 1/6] impl: Add a gazprea-clean folder for my changes --- gazprea-clean/Makefile | 20 + gazprea-clean/README.md | 31 ++ gazprea-clean/_static/css/googleFonts.css | 18 + gazprea-clean/_templates/.gitkeep | 0 gazprea-clean/assets/images/GazpreaLogo.png | Bin 0 -> 229908 bytes gazprea-clean/assets/images/logo-reverse.png | Bin 0 -> 18599 bytes gazprea-clean/conf.py | 79 +++ gazprea-clean/htaccess | 1 + gazprea-clean/impl/backend.rst | 116 +++++ gazprea-clean/impl/errors.rst | 323 ++++++++++++ gazprea-clean/impl/part_1.rst | 99 ++++ gazprea-clean/impl/part_2.rst | 38 ++ gazprea-clean/index.rst | 46 ++ gazprea-clean/make.bat | 35 ++ gazprea-clean/nextTime.txt | 144 ++++++ gazprea-clean/spec/built_in_functions.rst | 127 +++++ gazprea-clean/spec/comments.rst | 32 ++ gazprea-clean/spec/declarations.rst | 92 ++++ gazprea-clean/spec/expressions.rst | 154 ++++++ gazprea-clean/spec/functions.rst | 220 ++++++++ gazprea-clean/spec/globals.rst | 25 + gazprea-clean/spec/identifiers.rst | 63 +++ gazprea-clean/spec/keywords.rst | 85 +++ gazprea-clean/spec/procedures.rst | 256 ++++++++++ gazprea-clean/spec/statements.rst | 511 +++++++++++++++++++ gazprea-clean/spec/streams.rst | 259 ++++++++++ gazprea-clean/spec/type_casting.rst | 126 +++++ gazprea-clean/spec/type_inference.rst | 48 ++ gazprea-clean/spec/type_promotion.rst | 129 +++++ gazprea-clean/spec/type_qualifiers.rst | 66 +++ gazprea-clean/spec/typedef.rst | 78 +++ gazprea-clean/spec/types/boolean.rst | 80 +++ gazprea-clean/spec/types/character.rst | 82 +++ gazprea-clean/spec/types/integer.rst | 120 +++++ gazprea-clean/spec/types/real.rst | 67 +++ gazprea-clean/spec/types/string.rst | 97 ++++ gazprea_specification_issues.md | 29 +- 37 files changed, 3690 insertions(+), 6 deletions(-) create mode 100644 gazprea-clean/Makefile create mode 100644 gazprea-clean/README.md create mode 100644 gazprea-clean/_static/css/googleFonts.css create mode 100644 gazprea-clean/_templates/.gitkeep create mode 100644 gazprea-clean/assets/images/GazpreaLogo.png create mode 100755 gazprea-clean/assets/images/logo-reverse.png create mode 100644 gazprea-clean/conf.py create mode 100644 gazprea-clean/htaccess create mode 100644 gazprea-clean/impl/backend.rst create mode 100644 gazprea-clean/impl/errors.rst create mode 100644 gazprea-clean/impl/part_1.rst create mode 100644 gazprea-clean/impl/part_2.rst create mode 100644 gazprea-clean/index.rst create mode 100644 gazprea-clean/make.bat create mode 100644 gazprea-clean/nextTime.txt create mode 100644 gazprea-clean/spec/built_in_functions.rst create mode 100644 gazprea-clean/spec/comments.rst create mode 100644 gazprea-clean/spec/declarations.rst create mode 100644 gazprea-clean/spec/expressions.rst create mode 100644 gazprea-clean/spec/functions.rst create mode 100644 gazprea-clean/spec/globals.rst create mode 100644 gazprea-clean/spec/identifiers.rst create mode 100644 gazprea-clean/spec/keywords.rst create mode 100644 gazprea-clean/spec/procedures.rst create mode 100644 gazprea-clean/spec/statements.rst create mode 100644 gazprea-clean/spec/streams.rst create mode 100644 gazprea-clean/spec/type_casting.rst create mode 100644 gazprea-clean/spec/type_inference.rst create mode 100644 gazprea-clean/spec/type_promotion.rst create mode 100644 gazprea-clean/spec/type_qualifiers.rst create mode 100644 gazprea-clean/spec/typedef.rst create mode 100644 gazprea-clean/spec/types/boolean.rst create mode 100644 gazprea-clean/spec/types/character.rst create mode 100644 gazprea-clean/spec/types/integer.rst create mode 100644 gazprea-clean/spec/types/real.rst create mode 100644 gazprea-clean/spec/types/string.rst diff --git a/gazprea-clean/Makefile b/gazprea-clean/Makefile new file mode 100644 index 0000000..d4bb2cb --- /dev/null +++ b/gazprea-clean/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/gazprea-clean/README.md b/gazprea-clean/README.md new file mode 100644 index 0000000..b9b562b --- /dev/null +++ b/gazprea-clean/README.md @@ -0,0 +1,31 @@ +# Editing the Spec + +This project uses [Sphinx](https://www.sphinx-doc.org/) to generate +documentation from [reStructuredText](https://docutils.sourceforge.io/rst.html) +(RST). + +For a quick introduction to Sphinx, refer to the +[Sphinx Quickstart](https://www.sphinx-doc.org/en/master/usage/quickstart.html) +documentation. + +For a quick introduction to RST, refer to the +[reStructuredText Primer](https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html). + +# Building + +## Required Software +- `texlive-full` (for PDF output only) +- `python` + +## Required Python (PyPI) Packages +- `sphinx` +- `sphinx_rtd_theme` + +## Usage + +- `make html` to build html files +- `make latexpdf` to build PDF/LaTeX files +- `make clean` to delete build files + +The HTML build is output to the `_build/html` folder. +The PDF/LaTeX build is output to the `_build/latex` folder. diff --git a/gazprea-clean/_static/css/googleFonts.css b/gazprea-clean/_static/css/googleFonts.css new file mode 100644 index 0000000..427463f --- /dev/null +++ b/gazprea-clean/_static/css/googleFonts.css @@ -0,0 +1,18 @@ +/* + * This file is meant to reduce our upload size. Instead of uploading static + * font files, we outsource them instead to other static hosting sites. + * + * If you delete this file you must leave the generated + * _build/html/_static/css/fonts directory alone. This includes the line that + * deletes this folder in the root Makefile. + */ + +@import url('https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,400;0,700;1,400&family=Roboto+Slab:wght@400;700&display=swap'); + +@font-face { + font-family: 'FontAwesome'; + src: url('https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/fonts/fontawesome-webfont.eot?v=4.7.0'); + src: url('https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg'); + font-weight: normal; + font-style: normal; +} diff --git a/gazprea-clean/_templates/.gitkeep b/gazprea-clean/_templates/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/gazprea-clean/assets/images/GazpreaLogo.png b/gazprea-clean/assets/images/GazpreaLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..a0b0419d11b240686addb0647f113da553357eee GIT binary patch literal 229908 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 }vo4W+M7!P8Xc26|O$*l;yJTy5vfyW=7hnCt08 zky81rp`lgsM4E~r_#p5t8xk`IJGU~2Pu1<%bnbLN%6~JAKuHQRn#SUsZysSjwS3mL zpdEq*Tud$HYJU8;0=$}1>hp60IBFUN^thOu7%iUIsQJ#0am+z-nq+Uk5GX?Z3ku>)%jkN`0abod2WWqiE}dTvF1%f zbD5iJ2bOdHqH|D2T>z_DJ5-M|ER0w~gt|vZ({?6`-6&qUi@CY)MIyK2rmYa8TuD*D2ISL5C&%^U>@Hjo)3kscS@Ww|UY<#<2X=lOM_`Q4mv5rd7 zks-EJg{ax*K0noV)e)}?xYtqkiziIBVMPf2Am->5RBSY-9&15@`x}+Ff3jr4A#2~H zL+*^n$L2Kc2(ei6Z?gKgN5QTb#Q@_e^!JMzguf;TG&m2AB&o*S=jO1B$gxSe6a=nQgM7cP)*1A2lym(JJf1m_k4U`r)V}D zZF-;%Luq@4VQivQMXufxHRMK7`}XSHq_%B2!?CVQ# zzG)8d%|ABT(j$K@7z`30Zk6Ld+;20BJui&l_LTHK>VVAcr8YY;K(-DfORh(=o)Wfb zpG;)r=u7_vs%avd+ul*lZDq}Fb-|~}z>FMdfpK0#y?z77f zpXqa6sB21pU^Yh>oy4p}{e&(qr`Qj8)90`{z8+@?w3?;I!p!-ET|;~k$91))gKB-HWsl>IIL~>yI8VT-KuN|aWGa*zV33X!IbbT!uFY{bXWQSv8s#+{FRuibdB3U#qeI0;VO?UdNnB9|M?znFrAjG5vT2KL z53$aZ~#VuVoM@T}P9^~kk9GxJ?%Ey-i9#Y>MN=mk%}f~K8-9}sh`d`ZU1#F5%So(jIObl?r12)TJsl?L zl(SsJR!1Tw#Y{PT# zN*BN_vrS#X^QOvkn4|yVHjh1X%eO4PB9mP^TMYmU_v90vYICBK-9r+V8l${lJ4lU9YILRD`nVE1oFg_QvL9$%0rb}>`cU? zLgCeoVOcqZ=EQG-q$e1NBR+K*{^YLmEF+IL73_lH<71c!K8GI7qIMN}g=r!2SPxIw zqxtH&&H*@~Dp;bLl;6~K3vyiF?YX?ZHYo6^R@r)1(+vM&J)QRmX@lANDrY@wgN{*` zpnnp)>!a-4%07L|^S+8Rz@lzK2}SW-vKkRw+RBKVPPdZ-2bV{XUBlE z`-ZZ3pl+&oPdXNkjWGFzL)K}bZWZx0fVS4N2*dPQIYt?}-HvAlW*liTg?DZR%gR;Y zPE5ZqD5Vp^U;DK%{JFxkC_D1a1H>5Z%0>xq@kw#T7p4zD6qv^QyOocWZG#Dg`Aq(q zQPF)8!hDkE!B8HXNo6OWM=~BCj@>aB1rT>z2#c-ZZH`(W=+K*@qUrL9kuO@+2$c1N zRO*40VNtGl@ND}|HSGbnp9Vvcy51NN1MkoU=)I2_bsp4v ze5dhIDuBn~SO4s0jQ2Zt1qtMvQh|q4$LU`IqL|a)RJ8AVBFGv%@w_*~_4+5=VXC}& zuZ-k4TcSGjxw?yZtaVi0>>u4^6%&xQ7rxffCp?Q++ZCNt`eoNNz24=&^ru}{lZq%K z5STBryzo!}*}ZXm(;DbuQ9DmvPjLbWq^(7NYsQRdO2;Qb#0Uzu4rt;9i1fTxiHWZ- z{!*S452)g9l8rc-%C+PBb!p|8pC4J#K0psm1%9s3-8OT3mvRWoTuES)vxS<-gjv4` z)3?o?B+Hx5^7201>%u_Rwzw*xH@#|u<(27V+*(g_gEtJS&sq=LCba#_yt5Whnl2$c z&E;711fIjsVDi(@n$&iYvnPLpz_#hdK3VGf$m$O48oGEYOoUQ*@&hd5vJ>Ck59DCu zQ^qE;2i(p2-M+sh$bv7S1~M1D^3(CgrbChVeD73kAD+r$?h7-n`xMXhiIiNIX(XF& zyS=8dWEHun^Oz3JUh@;p5G5IWPutpuZgci!`x#%ph_DU}WMb>@500%&g1b=}ru=x9 zFEN8In7g2Ay6C(`Gi_YRq%*qpJr@A@8_>5+uh1b^v#XEQA0J0acx_EOB4KVjNIR6u zv^fmmUd9B3`0_!Sd!Tm|_=AeO`3FQ2&AQCiQ6YzKNnDPwGJ{_%?Dp1899YM^jw@W~ zK7=neo&3o5O^*5jqG=uY*u%N?|V$ z^S?=zn@S`r(#{ik6_D;bTYI#NN=KtB>x_xHEy{m`ev4YXTG;SHR9f%xMOHo}fq<^W z(()J`PWjAQ-Lp)Y$L%$M${qw`W*I{>B z)cUId^>QtmSF(Db_nAwmoa*5-PZY&PFB*)JgwMT5Cbg*Bv@MXgU{O_cfZvDyyeA`E zbUO~$#^t?V8JcYFa<~*GxQ?6M7ZyF?YFAY)QCrBSLZlK zEtAUP7pounmuNNgHHvN^6tBbnb-B{u3bWhvXA*}kOz~=EF-U|HGXu#DGpV3{$}N5L zylF^;u73T`Jp?5V+fKS++NlNxK2J88!h{!g&bj8AqGvwQN^3E4>4e^Vvd@aPZB9F5 zxv7)qvY<>NQ&=B|W>VuoxbG_r4cnUpY^juL%=+Oein~YC(n4J+e#xe$uCb>2)AZ2R z#MC_*k0$0HUd_*@;d67DcJ^K=`YFEKs-;(BQT}WMJ>IJJpK z7UTI(frdx2IN!!R)$0;0@$MuOlDHotmupYuW{>6`Y|)S&LlMX_@1Z zmLaj)9ir%({8wQ`HFnNf^jbRAOu{hC)_Vj&%WQg1O5HCB#XsT`mQ*S{+)i)2&6e8~ z9})gCac(be?&|l$;oEVQq1X)y!F$oUhVd_lYv8wtMIQ?&d+;M>9Dtg}{Q_-P7nM+3RyveaTB$4UdJc z+t03-- z-WhgH;G>Dn(x!{tB$tP;%+AbqE?=kqX(4X=4557iT4uyz0vzHczUJUuXk9$NJaI(& z`|xgh_r(bYC@uzPxbq>gS};3y7S9*58Gnb|!_+HmDgmT6n${HBD_`VB`g}Ohw^o|3 z!Tw;JHTXt`>j(Hv$t!JY&)S{2>&{atqrJ^$zoY$uh77~B&rD z2mf=;L!ZV4Y@OTWg)3UvfikPl&n}L5>@JVzF5I16S<`54^pLe0+2Bz(TJTX9|IV&0 zroY=~*~VM}URt4B7`_Ofzk$&M!N*@`sHu*z^vvt%>z4HyWaX1zC6OJUCIOfSBvkMXkq z$?0X8h=I9_qc*TUb)iq|{7;A6iC2&Y$s9?p`KA^I ztGNG4_V&WG%Y|R`nNNnxLwh(nqJbp8>G&@2Qjo@l>gG^9+NMEt>OQK*GWx1SOaaaw zfs|IT{?FL&nq7ALn$I1~-Cb?&eyMA8B1^M(-0mHD-;p?pu`r1#v!BO%Y>W8YmFpWQ z8+lTx5H(Hv8;%zngege%SmJHGqKb%S;WYrR?PkyoPe#^mn~dw+y*S$VR$1=Eoks8N z;gdNSypm%pO_@oGObs(F7#NQiBHz*8RPd>SA$V8Kg&3`vxN`vj#4aT}rX)86Asy#@ zZ)22Zz3PjcMaQkTb> zAFEwWP(N4`#dJcOq&GBp>$7q8^aJc9kuWDq4F$kwwm@85Yu}i?sY{8!z3WRn>VgiW8yNqd@3F;yaYJl%VnT5)1o+{oziccJw#km>;q{R_XI>Fw- z;OpP3b9F8|PJyi~N(N5QL~7QrrI<%8oMC$1>UAxMT4-RaCnX3QBWCLT36q7X(c-^m zv#hi8niLobX{Rvz7AOebqPPh1zi3Yn8VO6FEGQz4!*WgTQR~cdGM|y8LS$fckrVp9 zm`OP-^3{ii^@bRHdjlIRw=@3 z0ePNmYAeW2-eMhh%7`$`1)yeOTTRo9t+K*j#vL&;+`AeVBUX|F9yyyKNRy6%rq z^fgs-9{?cis+y!$#Dg3Tb9IuX0J0X=Q0>25XO*$;KASK z8vuaR3?y@_eBh-NJb?M@0G4X4kLfjq-}>YoAuqESVwcF*57k8$?Dfjmf8AG*`_r(a zAx}D>GM+#MUXh|4OcT`>Di6>0`dflBp(mZV>U&=(hm{w3=i)qJd#CxJ$<9>!wK0;I zAu_X}GS*-`QsB1-rsu6~H2M|R+lAr9%bAlEwRRqIZoj%>SE0fDOVIzan78hcN>#;F z$lsGT27&SKmQA)aGEvPJi@`+*qr)22voOgf*~u+iwV zi193b10jXQIAL))?FoOgGg!GEy(=xVSV5oAVzs`jSL2&Pg}2r1o@fb8^U9g{hHd?x zdOypkDz=~dNB^?#tK+}1P{E)G2fFz%{jfRarVA)zz+dG9(u^ASg9?>gx9)&{ejajM^jPR zGc;;JB1}g&bnp8{t*`$vY8>O+4}zv=IcGYxV~PN5_aV*YfaDY=C4)f@5~*mMu;elJ z^5fvrkWmvxGj%EAiH>Cyb1svzCK{a(uSr_GgFa?{GN6|GRhmOGx9Johmv^^FjYE>v zF79ol#m@;58V(}^!x0B*%^5hR;*g?8rOf`7=@rxZI6^s3tyH~2CKi{Up8z^h(r4pn z7Tb_YiD9?MrN-WE@qOg;RSI%g<3f8qD4y}aPV$Uyq8dSYEvo*LU78_KKwELr{vN#@ zS8t@wUlg21bsXHsDIHxisFo9G)x0-dU3Z5!3%dZEvRwWB)Hsradk*HcsGzkP2eE#h zdpC!v!i(I@tDdoAA;*U9d>o|Wp|)(pH|=@?T-}bs(7wS087}T8@v(*HO_@3GY@h2- z-=|?N-reI0+H?v5O%3J)lnPwhXbfqjHl`BeZ}ag{&VPi7;G!wFW%K@r^Mj4R?WUzLVmy}c*TdM zPDU?_g%U5^F{-RKj(nMKoT$Vpvν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

0#v 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 literal 0 HcmV?d00001 diff --git a/gazprea-clean/assets/images/logo-reverse.png b/gazprea-clean/assets/images/logo-reverse.png new file mode 100755 index 0000000000000000000000000000000000000000..5db0b5ba8f8f68d6b4414e566f7e4c868c7ab93d GIT binary patch literal 18599 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 e!GeWQ$NvM;pRq47_RFyV0000 !llvm.ptr + llvm.func @free(!llvm.ptr) + llvm.func @main() -> i32 { + %0 = llvm.mlir.constant(128 : i32) : i32 + %1 = llvm.call @malloc(%0) : (i32) -> !llvm.ptr + llvm.call @free(%1) : (!llvm.ptr) -> () + %c0_i32 = llvm.mlir.constant(0 : i32) : i32 + llvm.return %c0_i32 : i32 + } + } + +It is important that the code generated by your compiler has no memory leaks, +and that all memory is freed as it leaves scope. + +.. _ssec:backend_runtime: + +Runtime Libraries +----------------- + +If you make a runtime library, the runtime library must be implemented +in a runtime directory (``runtime``). Beware that in C++ there is additional +name mangling that occurs to allow class functions. Thus, we recommend +that all runtime functions should be written in C and not in C++. There +is a Makefile in the ``runtime`` folder designed to turn all ``*.c`` and +``*.h`` pairs into part of the unified runtime library ``libruntime.a``. +An example of how to make a runtime function is provided bellow. + +``functions.c`` + +:: + + #include "functions.h" + + uint64_t factorial(uint64_t n) { + uint64_t fact = 1; + + while (n > 0) { + fact *= n; + n--; + } + + return fact; + } + +``functions.h`` + +:: + + #pragma once + + #include + + uint64_t factorial(uint64_t n); + +If your compiler was compiling the following input + +:: + + 3! + (2 + 7)! + +Here is how to call the function in the LLVM dialect of MLIR: + +``MLIR src`` + +:: + + module { + // This makes the function available for calling + llvm.func @factorial(i64) -> i64 + + llvm.func @main() -> i32 { + // Calls factorial with the constant 3 as an argument + %0 = llvm.mlir.constant(3 : i64) : i64 + %1 = llvm.call @factorial(%0) : (i64) -> (i64) + + // Adds 2 and 7 together + %2 = llvm.mlir.constant(2 : i64) : i64 + %3 = llvm.mlir.constant(7 : i64) : i64 + %4 = llvm.add %2, %3 : i64 + + // Calls factorial with the result of 2+7 + %5 = llvm.call @factorial(%4) : (i64) -> (i64) + + // Adds the result of 3! with (2+7)! + %6 = llvm.add %1, %5 : i64 + + // Done, return 0 + %c0_i32 = llvm.mlir.constant(0 : i32) : i32 + llvm.return %c0_i32 : i32 + } + } + diff --git a/gazprea-clean/impl/errors.rst b/gazprea-clean/impl/errors.rst new file mode 100644 index 0000000..349a040 --- /dev/null +++ b/gazprea-clean/impl/errors.rst @@ -0,0 +1,323 @@ +.. _sec:errors: + +Errors +====== + +Your implementation is required to report both compile-time and run-time errors. +You must use the exceptions defined in ``include/CompileTimeExceptions.h`` and +the functions defined in ``runtime/include/run_time_errors.h``. Do not modify +these files, you can pass a string to a constructor/function to provide more +details about a particular error. You must pass the corresponding line number to +the exceptions for compile-time errors but not run-time errors. Do not create +new errors. Your compiler is only expected to report the first error it +encounters. + +Syntax Errors +~~~~~~~~~~~~~ + +ANTLR handles syntax errors automatically, but you are required to override the +behavior and throw the ``SyntaxError`` exception from +``include/CompileTimeExceptions.h``. + +For example: + +:: + + /* main.cpp */ + + class MyErrorListener : public antlr4::BaseErrorListener { + void syntaxError(antlr4::Recognizer *recognizer, antlr4::Token * offendingSymbol, + size_t line, size_t charPositionInLine, const std::string &msg, + std::exception_ptr e) override { + std::vector rule_stack = ((antlr4::Parser*) recognizer)->getRuleInvocationStack(); + // The rule_stack may be used for determining what rule and context the error has occurred in. + // You may want to print the stack along with the error message, or use the stack contents to + // make a more detailed error message. + + throw SyntaxError(line, msg); // Throw our exception with ANTLR's error message. You can customize this as appropriate. + } + }; + + int main(int argc, char **argv) { + + ... + + gazprea::GazpreaParser parser(&tokens); + + parser.removeErrorListeners(); // Remove the default console error listener + parser.addErrorListener(new MyErrorListener()); // Add our error listener + + ... + } + +For more information regarding the handling of syntax errors in ANTLR, refer to +chapter 9 of +`The Definitive ANTLR 4 Reference `__. + +Compile-time Errors +------------------- + +Compile-time errors must be handled by throwing the exceptions defined in +``include/CompileTimeExceptions.h``. To throw an exception, use the ``throw`` +keyword. + +:: + + throw MainError(1, "program does not have a main procedure"); + +Here are the compile-time errors your compiler must throw: + +* ``SyntaxError`` + + Raised during compilation if the parser encounters a syntactic error in the + program. + +* ``SymbolError`` + + Raised during compilation if an undefined symbol is referenced or a defined + symbol is re-defined in the same scope. + +* ``TypeError`` + + Raised during compilation if an operation or statement is applied to or + betweeen expressions with invalid or incompatible types. + +* ``AliasingError`` + + Raised during compilation if the compiler detects that mutable memory + locations may be aliased. + +* ``AssignError`` + + Raised during compilation if the compiler detects an assignment to a const + value or a tuple unpacking assignment with the number of lvalues different + than the number of fields in the tuple rvalue. + +* ``MainError`` + + Raised during compilation if the program does not have a procedure named + ``main`` or when the signature of ``main`` is invalid. + +* ``ReturnError`` + + Raised during compilation if the program detects a function or procedure + with a return value that does not have a return statement reachable by all + control flows. Control flow constructs may be assumed to always be undecideable, + meaning they may branch in either direction. + + If the subroutine has a ``return`` statement with a type that does not + match the owning subroutine's type, the line number of the ``return`` + statement should be reported, along with the name and (correct) type of the + enclosing routine. + + Note also that, strictly speaking, this is a type error, not a return error. + If the procedure/function is missing a ``return`` statement, then the line + number of the subroutine declaration should be printed instead. + +* ``GlobalError`` + + Raised during compilation if the program detects a ``var`` global + declaration, a global declaration without an initializing expression, a + global declaration with an invalid initializing expression or any statement + that does not belong in the global scope. + +* ``StatementError`` + + Raised during compilation if the program is syntactically valid but the + compiler detects an invalid statement in some context. For example, + ``continue`` or ``break`` outside of a loop body. + +* ``CallError`` + + Raised during compilation if the procedure call statement is used to call a + function. Also raised if a procedure is called in an invalid context. For + example, a procedure call in an output stream expression. + +* ``DefinitionError`` + + Raised during compilation if a procedure or function is declared but not + defined. + +* ``LiteralError`` + + Raised during compilation if a literal value in the program does not fit + into its corresponding data type. + +* ``MathError`` + + May be raised during compile time expression evaluation when division by zero occurs. + Conditions for raising are eqivalent to a runtime ``MathError``. + +* ``IndexError`` + + May be raised during compilation if an expression used to index an array is an + ``integer``, but is invalid for the array size. + +* ``SizeError`` + + May be aised during compilation if the compiler detects an operation or statement + is applied to or between arrays with invalid or incompatible + sizes. Read more about when a ``SizeError`` should be raised at run-time + instead of compile-time in the :ref:`ssec:errors_sizeErrors` section. + +* ``StrideError`` + + May be raised during compilation if the ``by`` operation is used with a stride value + ``<=0``. + +Here is an example invalid program and a corresponding compile-time error: + +:: + + 1 procedure main() returns integer { + 2 integer x; + 3 } + +:: + + ReturnError on line 1: procedure "main" does not have a return statement reachable by all control flows + +Run-time Errors +--------------- + +Run-time errors must be handled by calling the functions defined in +``runtime/include/run_time_errors.h``. + +:: + + MathError("cannot divide by zero") + +The runtime errors listed below are a subset of compile time errors. Since it is not only impractical, +but undecidable to catch the following errors exclusively at compile time, Gazprea leaves the setting +at which they are raised up to the implementation. To put simply, you can raise runtime errors either +at compile time or at runtime and the tester will accomodate to different implementations. + +* ``SizeError`` + + Raised at runtime if an operation or statement is applied to or between + arrays with invalid or incompatible sizes. + +* ``IndexError`` + + Raised at runtime if an expression used to index an array is an + ``integer``, but is invalid for the array size. + +* ``MathError`` + + Raised at runtime if either zero to the power of N, where N is <= 0, or a + division by zero is evaluated. + +* ``StrideError`` + + Raised at runtime if the ``by`` operation is used with a stride value + ``<=0``. + +Here is an example invalid program. If your compiler is smart, you may raise the later error, if you +perfer not to implement static analysis, the former error can be emited at runtime. + +:: + + 1 procedure main() returns integer { + 2 integer[3] x = [2, 4, 6]; + 3 return integer[4]; + 4 } + +:: + + IndexError: This is a runtime error, invalid index "4" on array with size 3. + +:: + + IndexError on line 3: This is a compile time error, invalid index of "4" on array with size 3. + + +More Examples +------------- + +:: + + /* Indexes */ + character[3] v = ['a', 'b', 'c']; // Indexing is harder than it looks! + integer i = 10; + v(3) = 'X'; // SyntaxError + v[i] = '?'; // Run-timeerror + v['a'] = '!'; // TypeError + i[1] = 1; // SymbolError + + /* Tuples */ + tuple (integerm integer) a = (9, 5); + integer b; + integer c; + integer d; + b, c, d = a; // AssignError + tuple(integer, integer, integer) z = a; // TypeError + + +How to Write an Error Test Case +------------------------------- + +Your compiler test suite can include error test cases. An error test case can include +a compile-time or run-time error. In either case, the expected output should include +exactly one line of text. In order to simplify marking, **only one error should be present in the test case** +and exactly one line of expected output should catch it. Below is an example: + +:: + + var integer x = 0; + + procedure main() returns integer { + return 0; + } + +:: + + GlobalError on line 1 + +Precisely defining the line number on which an error occurs can be difficult. +Should the ``AssignError`` below occur on line 3, 6 or in between? + +:: + + procedure main() returns integer { + const integer i = 5; + i + = + 5 + ; + } + +For this reason, test cases that deliberately make the line number ambiguous will be disqualified. +If an obvious line number is not apparent, refer to the reference solution on the 415 +compiler explorer. For runtime errors, the line number is not required. Here is an +example of a run-time error test case and the corresponding expected output file: + +:: + + procedure main() returns integer { + 1..1 by 0 -> std_output; + return 0; + } + +:: + + StrideError + +How to make the Tester Happy +------------------------------------------ + +For error test cases, the tester inspects the first line from ``stderr``. +Therefore, you must ensure that you do not pollute this stream with debug messages etc. + +Additionally, the tester only knows to stop the toolchain prematurely if your program +terminates with a non-zero exit code. Once you have caught an error make sure to return +a non-zero exit code. + +Finally, the tester is lenient towards the type given to a particular errror. Specifically +the tester simply confirms that the substring "Error" is present and for compile +time errors that the correct line is provided. + +This leniency is motivated by the fact that sometimes determining which type to call an error is +difficult. For example, it may be arguable that a ``ReturnError`` should be interpreted as a +``TypeError`` and vice versa as previously mentioned. + + diff --git a/gazprea-clean/impl/part_1.rst b/gazprea-clean/impl/part_1.rst new file mode 100644 index 0000000..7b7128e --- /dev/null +++ b/gazprea-clean/impl/part_1.rst @@ -0,0 +1,99 @@ +.. _sec:part1: + +Compiler Implementation — Part 1 +================================ + +This section lists the portions of the *Gazprea* specification that must +be implemented to complete the part 1 of the compiler implementation. +All developers are advised to read the full specification for the +language prior to start the implementation of Part 1 because decisions +made while implementing Part 1 can make the implementation of Part 2 +significantly more challenging. Thus, planning ahead for Part 2 is the +recommended strategy. + +#. :ref:`sec:comments` +#. :ref:`sec:types` + + * :ref:`ssec:boolean` + * :ref:`ssec:character` + * :ref:`ssec:integer` + * :ref:`ssec:real` + * :ref:`ssec:tuple` + +#. Type Support + + * :ref:`sec:typeQualifiers` + + * :ref:`ssec:typeQualifiers_var` + * :ref:`ssec:typeQualifiers_const` + + * :ref:`sec:typePromotion` + * :ref:`sec:typeCasting` + * :ref:`sec:typeInference` + * :ref:`sec:typealias` + +#. :ref:`sec:statements` + + * :ref:`ssec:statements_assign` + * :ref:`sec:declaration` + * :ref:`sec:global` + * :ref:`ssec:statements_block` + * :ref:`ssec:statements_loop` + + * :ref:`ssec:statements_break` + * :ref:`ssec:statements_continue` + + * :ref:`ssec:statements_cond` + * :ref:`sec:streams` + * :ref:`sec:function` + * :ref:`sec:procedure` + +#. :ref:`sec:expressions` + + * unary+, unary-, not + + * ^ + + * \*,/,% + + * +,- + + * <,>,<=,>=,==,!= + + * and + + * or, xor + + * Variable references + + * Literal Values + + * Tuple reference + + * Function calls + +#. :ref:`sec:errors` + + * SyntaxError + + * SymbolError + + * TypeError + + * AliasingError + + * AssignError + + * MainError + + * ReturnError + + * GlobalError + + * StatementError + + * CallError + + * DefinitionError + + * MathError diff --git a/gazprea-clean/impl/part_2.rst b/gazprea-clean/impl/part_2.rst new file mode 100644 index 0000000..179ef94 --- /dev/null +++ b/gazprea-clean/impl/part_2.rst @@ -0,0 +1,38 @@ +Compiler Implementation — Part 2 +================================ + +This section list the elements of the *Gazprea* specification that must +be completed for the Part 2 of the compiler implementation. All the +elements of Part 1 must have been completed because Part 2 builds on +Part 1. + +#. :ref:`All Previous Features ` +#. :ref:`sec:types` + + * :ref:`ssec:array` + * :ref:`ssec:matrix` + * :ref:`ssec:string` + * :ref:`ssec:vector` + * :ref:`ssec:struct` + * :ref:`ssec:tuple` + +#. :ref:`sec:statements` + + * :ref:`sssec:statements_iter_loop` + +#. :ref:`sec:expressions` + + * :ref:`Operators ` + * :ref:`ssec:expressions_generators` + +#. :ref:`sec:builtIn` + + * :ref:`ssec:builtIn_reverse` + * :ref:`ssec:builtIn_rows_cols` + * :ref:`ssec:builtIn_length` + * :ref:`ssec:builtIn_format` + * :ref:`ssec:builtIn_stream_state` + +#. :ref:`ssec:backend_memory` + +#. :ref:`sec:errors` diff --git a/gazprea-clean/index.rst b/gazprea-clean/index.rst new file mode 100644 index 0000000..54a4f74 --- /dev/null +++ b/gazprea-clean/index.rst @@ -0,0 +1,46 @@ +|gazprea_logo| + +Gazprea +======= + +*Gazprea* is derived from a language originally designed at the IBM +Hardware Acceleration Laboratory in Markham, ON. + +.. toctree:: + :hidden: + + self + +.. toctree:: + :maxdepth: 3 + :caption: Language Specification + :numbered: + + spec/keywords + spec/identifiers + spec/comments + spec/declarations + spec/type_qualifiers + spec/types + spec/type_inference + spec/type_casting + spec/type_promotion + spec/typedef + spec/streams + spec/expressions + spec/statements + spec/functions + spec/procedures + spec/globals + spec/built_in_functions + +.. toctree:: + :maxdepth: 2 + :caption: Implementation + + impl/backend + impl/part_1 + impl/part_2 + impl/errors + +.. |gazprea_logo| image:: assets/images/GazpreaLogo.png diff --git a/gazprea-clean/make.bat b/gazprea-clean/make.bat new file mode 100644 index 0000000..2119f51 --- /dev/null +++ b/gazprea-clean/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/gazprea-clean/nextTime.txt b/gazprea-clean/nextTime.txt new file mode 100644 index 0000000..1388b5e --- /dev/null +++ b/gazprea-clean/nextTime.txt @@ -0,0 +1,144 @@ +Should multi-step implicit promotion be allowed? + - e.g. `[2.4, 3.6] * 5` +Define or disallow scalar to Matrix promotion with Matrix Multiplication operator (**) + - e.g. `[[1,2],[3,4],[5,6]] ** 2` +Two-sided promotion allowed? + - e.g. `1 + 1..10` = `[1 1 1] + [1 2 3]`? +How should string concatenation with a character work? + - e.g. `"abcd" || 'e'` + - Disallowed, clarify that `||` only works between `string` and `character[*]` + - As an append, resulting in `"abcde"` + - As a splat and concatenate, resulting in `"abcdeeee"` +Should we allow casting of `null` and `identity`? + - e.g. `as(null)` +Should we change to type and other symbols in a shared scope tree or remain with non-conflicting resolution paths. + - e.g. + ``` + typedef integer a; + const integer a = 0; // Redefinition of symbol `a` or legal? + ``` +How should we refer to functions and procedures collectively when something applies to both? + - Routine + - Subroutine + +How should we approach rewinding whitespace? + - Don't. + - Limit buffer. + - Run-length encoding. + +Reporting errors for size mismatches, compile vs runtime. +e.g. `integer[1 + 2] vec = 1..10;` +Quick fix implemented: +"We've decided to simplify this portion of the specification. There will be no expressions in a size declaration. +The only two valid tokens in a size declaration are * and a literal integer. If the size is a literal integer AND +the variable is initialized with 1) a literal vector or a matrix whose size is a literal in the specified dimension, + or 2) an interval whose bounds are literals, you should perform compile time size checking." + +Should tuples be mutable? +``` +tuple(integer, integer) x = (1, 6); +x.1 = 8; // is this valid? +x.2 <- std_input // is this valid? +``` +``` +// valid: +tuple(integer, integer) tup = (1, 2); +tup = (3, tup.2); // Like changing tup.1 = 3 +``` + +Allow intervals to be printed? +Intervals can't be printed. You would need to print it like this: `1..3 by 1 ->std_output` + +Allow tuple printing? + +Tuple assignment, field renaming. This should be the expected behavior? +e.g. +``` +tuple(real a, real b) foo = (1, 2); +tuple(real c, real d) bar = (3, 4); + +var baz = foo; +baz.a -> std_output; // 1 +baz.b -> std_output; // 2 + +baz = bar; +baz.a -> std_output; // 3 +baz.b -> std_output; // 4 +``` + + +The following code isn't legal +`boolean x = not null;` +In particular, unary operators on the polymorphic constants can't +determine their type without visiting multiple levels of the tree and eventually revisiting to determine the final value +`float x = - + - + - + identity;` + + +Function and variable with the same name. +``` +procedure f(integer a) returns integer {...} +procedure main() return integer { + integer f = 0; + call f(f); + return 0; +} +``` +Should `call f(f);` be resolved to call function f with argument integer f? Or should an error be raised: attempt to call an integer? + + +Change the `reverse` built-in function to accept/return a string instead of a character vector? +``` +string s = "hi"; +string rs = reverse(s); +``` +equivalent to +``` +string s = "hi"; +string rs = as(reverse(as(s))); +``` +but +``` +string s = "hi"; +reverse(s) -> std_output; +``` +produces (at the moment) `['i', 'h']` + + +Behavior of break statements in iterator loops with multiple domains +``` +loop i in u, j in v{ + break; +} +// is equivalent to +loop i in u { + loop j in v { + break; + } +} +``` + + +If passing by reference, types must match? +``` +procedure p(var real a) { + a = 2.5; +} +/* called in main */ +integer i = 3; +call p(i); // error, differing types? +``` + + +Operations on characters +`character x = ('x');` is invalid because characters have no defined operations. +is `character[2] y = (['x', 'y']);` valid? +This is inconvenient because many students implemented characters as a part of expressions. Then (expr) != expr + + +Indexing on intervals is not allowed, but one could cast the interval to a vector before indexing. +Couldn't the interval also be promoted to a vector automatically? +``` +integer interval x = 1..3; +integer a = x[2]; // Illegal +``` + diff --git a/gazprea-clean/spec/built_in_functions.rst b/gazprea-clean/spec/built_in_functions.rst new file mode 100644 index 0000000..877621e --- /dev/null +++ b/gazprea-clean/spec/built_in_functions.rst @@ -0,0 +1,127 @@ +.. _sec:builtIn: + +Built-In Functions +================== + +*Gazprea* has some built-in functions. These built in functions may have +some special behaviour that normal functions can not have, for instance +many of them will work on arrays of any element type. +Normally a function must specify the element type of an array argument. + +The name of built in functions are reserved and a user program cannot +define a function or a procedure with the same name as a built-in function. +If a declaration or a definition with the same name as a built-in function is +encountered in a *Gazprea* program, then the compiler should issue an error. + +Note that although the examples below all use arrays, all the built-ins work +on Vectors and Strings, since they are always compatible with arrays. + +.. _ssec:builtIn_length: + +Length +------ + +``length`` takes an array of any element type, and returns an integer +representing the number of elements in the array. + +:: + + integer[*] v = 1..5; + + length(v) -> std_output; /* Prints 5 */ + + +.. _ssec:builtIn_rows_cols: + +Shape +----- + +The built-in ``shape`` operates on arrays of any dimension, and returns an +array listing the size of each dimension. + +:: + + integer[*, *] M = [[1, 2, 3], [4, 5, 6]]; + + shape(M) -> std_output; /* Prints [2, 3] */ + +.. _ssec:builtIn_reverse: + +Reverse +------- + +The reverse built-in takes any array, Vector, or String, and returns a +reversed version of it. + +:: + + integer[*] v = 1..5; + integer[*] w = reverse(v); + + v -> std_output; /* Prints 12345 */ + w -> std_output; /* Prints 54321 */ + +.. _ssec:builtIn_format: + +Format +------- + +The ``format`` built-in takes any scalar as input and returns a ``string`` +containing the formatted value of the scalar. + +:: + + integer i = 24; + real r = 2.4; + + "i = " || format(i) || ", r = " || format(r) || '\n' -> std_output; + // Prints: "i = 24, r = 2.4\n" + +Note that ``format`` will have to allocate space to hold the return string. +You will have to figure out how to manage the memory so it is reclaimed +eventually. + +.. _ssec:builtIn_stream_state: + +Stream State +------------ + +When reading values of certain types from ``std_input`` it is possible that an +error is encountered, or that the end of the stream has been encountered. In +order to handle these situations *Gazprea* provides a built in procedure that is +implicitly defined in every file: + +:: + + procedure stream_state(var input_stream) returns integer; + +This function can only be called with the ``std_input`` as a parameter, but it’s +general enough that it could be used if the language were expanded to include +multiple input streams. + +When called, ``stream_state`` will return an integer value. The return value is +an error code defined as follows: + + - ``0``: Last read from the stream was successful. + - ``1``: Last read from the stream encountered an error. + - ``2``: Last read from the stream encountered the end of the stream. + +``stream_state`` is initialized to ``0``, which is the value return if no +read has been issued. + +:: + + boolean b; + integer i; + + // Input stream: 9 + b <- std_input; // b = false (error reading boolean) + i = stream_state(std_input); // i = 1 (last read was error) + i <- std_input; // i = 9 (successfully read integer) + i = stream_state(std_input); // i = 0 (last read was success) + b <- std_input; // b = false (read end of stream) + i = stream_state(std_input); // i = 2 (last read was end of stream) + + +The input stream is described in more detail in the +:ref:`input stream ` section. diff --git a/gazprea-clean/spec/comments.rst b/gazprea-clean/spec/comments.rst new file mode 100644 index 0000000..5fd2bb3 --- /dev/null +++ b/gazprea-clean/spec/comments.rst @@ -0,0 +1,32 @@ +.. _sec:comments: + +Comments +======== + +*Gazprea* supports *C99* style comments. + +Single line comments are made using ``//``. Anything on the line after +the two adjacent forward slashes is ignored. For example: + +:: + + integer x = 2 * 3; // This is ignored + +Multi-line block comments are made using **/\*** and **\*/**. The start +of a block comment is marked using **/\***, and the end of the block +comment is the **first** occurrence of the sequence of characters +**\*/**. For example: + +:: + + /* This is a block comment. It can span as many lines as we want, and + only ends when the closing sequence is encountered. + */ + integer x = 2 * 3; /* Block comments can also be on a single line */ + +Block comments cannot be nested because the comment finishes when it +reaches the first closing sequence. For example, this is invalid: + +:: + + /* A comment /* A nested comment */ */ diff --git a/gazprea-clean/spec/declarations.rst b/gazprea-clean/spec/declarations.rst new file mode 100644 index 0000000..a87865d --- /dev/null +++ b/gazprea-clean/spec/declarations.rst @@ -0,0 +1,92 @@ +.. _sec:declaration: + +Declarations +============ + +Variables must be declared before they are used. Aside from +a few :ref:`special cases `, declarations have the +following formats: + +:: + + = ; + ; + +Both declarations are creating a variable with an :ref:`identifier ` of +````, with :ref:`type ` ````, and optionally a :ref:`type qualifier ` of ````. +The two qualifiers are ``var`` and ``const``, which qualify the identifier as +*mutable* or *immutable*, respectively. +In *Gazprea* it is important to remember that if the optional qualifier is +omitted the default is ``const``, i.e. variables are immutable by default. + +The first declaration style explicitly initializes the value of the new +variable with the value of ````. + +In *Gazprea* all variables must be initialized in a well defined manner in order +to ensure functional purity. If the variables are not initialized to a known +value their initial value might change depending on when the program is run. +Therefore, the second declaration style is equivalent to setting the value to +zero. + +For simplicity *Gazprea* assumes that declarations can only appear at +the beginning of a block. For instance this would not be legal in +*Gazprea*: + +:: + + var integer i = 10; + if (blah) { + i = i + 1; + real i = 0; // Illegal placement of a declaration. + } + +because the declaration of the real version of ``i`` does not occur at +the start of the block. + +The following declaration placement is legal: + +:: + + var integer i = 10; + if (blah) { + var real i = 0; // At the start of the block. All good. + i = i + 1; + } + +The declaration of a variable happens after initialization. Thus it is +illegal to refer to a variable within its own initialization statement. + +:: + + /* All of these declarations are illegal, they would result in garbage values. */ + integer i = i; + integer[10] v = v[0] * 2; + +An error message should be raised about the use of undeclared variables +in these cases. If a variable of the same name is declared in an +enclosing scope, then it is legal to use that in the initialization of a +variable with the same name. For instance: + +:: + + integer x = 7; + if (true) { + integer y = x; /* y gets a value of 7 */ + real x = x; /* Refers to the enclosing scope's 'x', so this is legal */ + + /* Now 'x' refers to the real version, with a value of 7.0 */ + } + +.. _ssec:declaration_special: + +Special cases +------------- + +Special cases of declarations are covered in their respective sections. + +#. :ref:`Arrays ` +#. :ref:`Matrices ` +#. :ref:`Tuples ` +#. :ref:`Globals ` +#. :ref:`Functions ` +#. :ref:`Procedures ` diff --git a/gazprea-clean/spec/expressions.rst b/gazprea-clean/spec/expressions.rst new file mode 100644 index 0000000..bde026d --- /dev/null +++ b/gazprea-clean/spec/expressions.rst @@ -0,0 +1,154 @@ +.. _sec:expressions: + +Expressions +=========== + +Expressions can only exist within a statement or another expression. + +.. _ssec:expressions_toop: + +Table of Operator precedence +---------------------------- + +The following is a table containing all of the precedences and +associativities of the operators in *Gazprea*. + ++----------------+------------------------------------+-------------------+ +| **Precedence** | **Operators** | **Associativity** | ++================+====================================+===================+ +| (Highest) 1 | ``.`` | left | ++----------------+------------------------------------+-------------------+ +| 2 | ``[]`` (indexing) | left | ++----------------+------------------------------------+-------------------+ +| 3 | ``..`` | N/A | ++----------------+------------------------------------+-------------------+ +| 4 | unary ``+``, unary ``-``, ``not`` | right | ++----------------+------------------------------------+-------------------+ +| 5 | ``^`` | right | ++----------------+------------------------------------+-------------------+ +| 6 | ``*``\ , ``/``\ , ``%``, ``**`` | left | ++----------------+------------------------------------+-------------------+ +| 7 | ``+``\ , ``-`` | left | ++----------------+------------------------------------+-------------------+ +| 8 | ``by`` | left | ++----------------+------------------------------------+-------------------+ +| 9 | ``<``\ , ``>``\ , ``<=``\ , ``>=`` | left | ++----------------+------------------------------------+-------------------+ +| 10 | ``==``\ , ``!=`` | left | ++----------------+------------------------------------+-------------------+ +| 11 | ``and`` | left | ++----------------+------------------------------------+-------------------+ +| 12 | ``or``\ , ``xor`` | left | ++----------------+------------------------------------+-------------------+ +| (Lowest) 13 | ``||`` | right | ++----------------+------------------------------------+-------------------+ + +.. _ssec:expressions_generators: + +Generators +---------- + +A generator may be used to construct either a one or two dimensional array. +A generator creates a value of a 1D array type when one domain variable is +used, and a 2D array type when two domain variables are used. +Any other number of domain variables will yield an error. + +A generator consists of either one or two domain expressions, +and an additional expression on the right hand side of the bar (``|``). +This additional expression is used to create the generated values. For example: + +:: + + integer[10] v = [i in 1..10 | i * i]; + /* v[i] == i * i */ + + integer[2][3] M = [i in 1..2, j in 1..3 | i * j]; + /* M[i][j] == i * j */ + +The expression to the right of the bar (``|``), is used to generate the +value at the given index. +Let ``T`` be the type of the expression to the right of the bar (``|``). Then, +if the domain of the generator is an array of size ``N``, the result will be a +array of size ``N`` with element type ``T``. Otherwise, if the domain of the +generator is a matrix of size ``N`` x ``M``, the result will be a matrix of size +``N`` x ``M`` with element type ``T``. +Generators may be nested, and +may be used within domain expressions. For instance, the generator below +is perfectly legal: + +:: + + integer i = 7; + + /* The domain expression should use the previously defined i \*/ + integer[*] v = [i in [i in 1..i | i] | [i in 1..10 | i * i][i]]; + + /* v should contain the first 7 squares. */ + +.. _ssec:expressions_dom_expr: + +Domain Expressions +------------------ + +Domain expressions consist of an identifier denoting an iterator variable and +an expression that evaluates to **any** array type. +Domain expressions can only appear within iterator loops and generators. +A domain expression is a way of declaring a variable that +is local to the loop or generator, that takes on values from +the domain expression array in order. +Domain expressions must evaluate to a type, which means empty literal arrays +yield a ``TypeError``. +The scope of the domain variables (the left hand side of the declaration) is +within the body of the generator or loop. +The domain expressions (the right hand side) are all evaluated before any of the +domain variables are initialized, and therefore the domain expression scope is +the one enclosing the iterator loop or generator. + +For instance: + +:: + + integer i = 7; + + /* This will print 1234567 */ + loop i in 1..i { + i -> std_output; + } + +Domain variables are not initialized when they are declared. For +instance, in loops they are initialized at the start of each execution of +the loop’s body statement. However, we may chain domain variables using +commas, such as in matrix generators. + +:: + + integer i = 2; + + /* The "i"s both domain expressions are at the same scope, which is + * the one enclosing the loop. Therefore the matrix is: [[0 0 0] [0 1 2] [0 2 4]] + */ + integer[3,3] mat = [ i in 0..i, j in 0..i | i*j ]; + +The domain for the domain expression is only evaluated once. For +instance: + +:: + + integer x = 1; + + /* 1..x is only evaluated the first time the loop executes, so it is + simply 1..1, and not an infinite loop. */ + loop i in 1..x { + x = x + 1; + } + +This is true for domain expressions within generators as well. + +Iterator variables can be assigned to and re-declared within the enclosed iterator loop. +The variable is re-initialized according to the expression each iteration. + +:: + + loop i in 1..6 { + integer i = 5; + } diff --git a/gazprea-clean/spec/functions.rst b/gazprea-clean/spec/functions.rst new file mode 100644 index 0000000..0d1bbdb --- /dev/null +++ b/gazprea-clean/spec/functions.rst @@ -0,0 +1,220 @@ +.. _sec:function: + +Functions +========= + +A function in *Gazprea* has several requirements: + +1. All of the arguments are implicitly ``const``, and can not be mutable. + +2. Function arguments cannot contain type qualifiers. Including a type qualifier with a function argument should result in a ``SyntaxError``. + +3. Argument types must be explicit. Inferred size arrays are allowed + +4. Functions can not perform any I/O. + +5. Functions can not rely upon any mutable state outside of the function. + +6. Functions can not call any procedures. + +7. Functions must be declared in the global scope. + +The reason for this is to ensure that functions in *Gazprea* behave as +pure functions. Every time you call a function with the same arguments +it will perform the exact same operations. This has a lot of benefits. +It makes code easier to understand if functions only depend upon their +inputs and not some hidden state, and it also allows the compiler to +make more assumptions and as a result perform more optimizations. + +.. _ssec:function_syntax: + +Syntax +------ + +A function is declared using the function keyword. Each function is +given an identifier, and an arguments list enclosed in parenthesis. If +no arguments are provided an empty set of parenthesis, ``()``, must be +used. The return type of the function is specified after the arguments +using ``returns``. + +A function can be given by a single expression. For instance: + +:: + + function times_two(integer x) returns integer = 2 * x; + +This defines a function called times_two which can be used as follows: + +:: + + /* Prints 8. value gets assigned the result of calling times_two with an + argument of 4 + */ + integer value = times_two(4); + + value -> std_output; "\n" -> std_output; + +Functions can have an arbitrary number of arguments. Here are some +examples of functions with different numbers of arguments: +:: + + /* A function with no arguments */ + function f() returns integer = 1; + + /* A function with two arguments */ + function pythag(real a, real b) returns real = (a^2 + b^2)^(1./2); + + /* A function with different types of arguments */ + function get(real[*] a, integer i) returns real = a[i]; + +These can be called as follows: + +:: + + integer x = f(); /* x == 1 */ + real c = pythag(3, 4); /* Type promotion to real arguments. c == 5.0 */ + real value = get([i in 1..10 | i], 3); /* value == 3 */ + +A function’s body can also be given by a block statement instead of a +single expression. In this case the return value of the function is +given with the return statement. A return statement must be reached by +all possible control flows in the function before the end of the +function is encountered. + +:: + + /* Invalid -- should cause a compiler error */ + function f (boolean b) returns integer { + if (b) { + return 3; + } + } + + /* Valid, all possible branches hit a return statement with a valid type */ + function g (boolean b) returns integer { + if (b) { + return 3; + } + else { + return 8; + } + } + +``f`` is invalid since if ``b == false``, then we reach the end of the +function without a return statement, so we don’t know what value +``f(false)`` should take on. + +:: + + /* This is invalid because if the loop ever finished executing the + function would end before a return statement is encountered. In + general the compiler can not tell when a loop would execute + forever, so we make the assumption that all branches in the control + flow could be followed. */ + function f() returns integer { + var integer x = 0; + loop { + x = x + 1; + } + } + + /* This is valid. Even though the loop goes on forever so that a + return is never reached, execution never hits the end of the + function without a return. */ + function g() returns integer { + var integer x = 0; + loop { + x = x + 1; + } + + return x; + } + +Each function has its own scope, but globals can be accessed within the +function if they were declared before the function was defined. + +.. _ssec:function_fwd_declr: + +Function Prototypes +------------------- + +Functions can be declared before they are defined in a *Gazprea* file. +This allows function definitions to be moved to more convenient +locations in the file, and allows for multiple compilation units if the +function definitions are in different source files. + +:: + + /* Forward declaration, no body */ + function f(integer y, integer) returns integer; + + procedure main() returns integer { + integer y = f(13, 2); + /* Can use this in main, even though the definition is below */ + return 0; + } + + function f(integer x, integer z) returns integer = x*z; + +Note that only the type signatures of the forward declaration of the +function and the definition must be identical. That means the argument names in +the prototype are *optional*. If the prototype arguments are given names they +do not have to match the argument names in the function definition. + + +.. _ssec:function_vec_mat: + +Array and Matrix Parameters and Returns +---------------------------------------- + +The arguments and return value of functions can have both explicit and inferred sizes. For example: + +:: + + function to_real_vec(integer[*] x) returns real[*] { + /* Some code here */ + } + + function transpose3x3(real[3,3] x) returns real[3,3] { + /* Some code here */ + } + + +Like Rust, array *slices* may be passed as arguments: + +:: + + function to_real_vec(integer[*] x) returns real[*] { + real[*] rvec = x; + return rvec; + } + + function slicer() returns real[*] { + integer a[10] = 1..10; + var vector two_halves = to_real_vec(a[1..5]); + two_halves.append(to_real_vec(a[6..])); + return two_halves; + } + +Remember that all function parameters are ``const`` in *Gazprea*, so that all +functions are pure. That means that while it is legal to pass arrays and slices +*be reference*, the array contents cannot be modified inside the function, +because the change would be visible outside the function. You must check that +the ``const`` requirement is honored. + +.. _ssec:function_namespacing: + +Function Namespacing +-------------------- + +In *Gazprea* function declarations occur in the global scope. +This means that two functions with the same name cannot coexist in the same +gazprea program, nor can you forward declare the same function twice. + +Additionally, functions share the following namespaces: + +- The ``struct`` namespace: you cannot have a struct and function with the same + name in the same gazprea program. + +- The ``procedure`` namespace: You cannot have a procedure and function with + the same name in the same gazprea program. diff --git a/gazprea-clean/spec/globals.rst b/gazprea-clean/spec/globals.rst new file mode 100644 index 0000000..9ea08bc --- /dev/null +++ b/gazprea-clean/spec/globals.rst @@ -0,0 +1,25 @@ +.. _sec:global: + +Globals +======= + +In *Gazprea* values can be assigned to a global identifier. All globals +must be immutable (``const``). If a global identifier is declared with +the ``var`` specifier, then an error should be raised. This restriction is in +place since mutable global variables would ruin functional purity. +If functions have access to mutable global state then we can not guarantee +their purity. + +Globals must be initialized with a valid :ref:`constant expression `. + +This requirement ensures that the value of every global can be determined by +the compiler before the program runs. This restriction is in place to support +functional purity and enable compile-time optimizations. As a result of this +rule: + +* Functions, procedures, or I/O operations may not appear in a global's + initializer. +* Globals cannot have a dynamically-sized array type (e.g., ``integer[*]``), + as their size cannot be determined at compile time. +* All globals are implicitly ``constexpr``. + diff --git a/gazprea-clean/spec/identifiers.rst b/gazprea-clean/spec/identifiers.rst new file mode 100644 index 0000000..4e742da --- /dev/null +++ b/gazprea-clean/spec/identifiers.rst @@ -0,0 +1,63 @@ +.. _sec:identifiers: + +Identifiers +=========== + +Identifiers in *Gazprea* must start with either an underscore or a +letter (upper or lower cased). Subsequent characters can be an +underscore, letter (upper or lower case), or number. An identifier may +not be any of *Gazprea*\ ’s keywords. Here are some valid identifiers in +*Gazprea*: + +:: + + hello + h3ll0 + _h3LL0 + _Hi + Hi + _3 + +The following are some examples of invalid identifiers. They begin with +a number, contain invalid characters, or are a keyword: + +:: + + 3d + in + a-bad-variable-name + no@twitter + we.don't.like.punctuation + +*Gazprea* imposes no restrictions on the length of identifiers. + +.. _ssec:namespace: + +Namespaces +========== + +Identifiers are used by variables, user-defined types, functions and procedures. + +For the most part, user-defined types are in their own namespace because their +usage does not collide with variables or functions. +The one exception is that struct literals can look like function calls: + +:: + + struct A (integer i, real j); + A a = A(i, j); + +Consequently, struct literals and functions share the same namespace. +In the above example, a definition of function ``A`` should generate a +``SymbolError``, but a definition of variable ``A`` would not. +Outside of types, variables and functions/procedures share the same namespace +in a scope and shadowing is possible between these types. + +:: + + function x() returns integer; // "x" refers to this function in the global scope + + procedure main() { + integer x = 3; // "x" refers to this variable in the scope of main + } + ... diff --git a/gazprea-clean/spec/keywords.rst b/gazprea-clean/spec/keywords.rst new file mode 100644 index 0000000..4c83471 --- /dev/null +++ b/gazprea-clean/spec/keywords.rst @@ -0,0 +1,85 @@ +.. _sec:keywords: + +Keywords +======== + +*Gazprea* has a number of built in keywords that are reserved and should +not be used by a programmer. + +- and + +- as + +- boolean + +- break + +- by + +- call + +- character + +- columns + +- const + +- continue + +- else + +- false + +- format + +- function + +- if + +- in + +- integer + +- length + +- loop + +- not + +- or + +- procedure + +- real + +- return + +- returns + +- reverse + +- rows + +- std_input + +- std_output + +- stream_state + +- string + +- struct + +- true + +- tuple + +- typealias + +- var + +- vector + +- while + +- xor diff --git a/gazprea-clean/spec/procedures.rst b/gazprea-clean/spec/procedures.rst new file mode 100644 index 0000000..1d6be19 --- /dev/null +++ b/gazprea-clean/spec/procedures.rst @@ -0,0 +1,256 @@ +.. _sec:procedure: + +Procedures +========== + +A procedure in *Gazprea* is like a function, except that it does not +have to be pure and as a result it may: + +- Have arguments marked with ``var`` that can be mutated. By default + arguments are ``const`` just like functions. + +- A procedure may only accept a literal or expression as an argument if + and only if the procedure declares that argument as ``const``. + +- Procedures may perform I/O. + +- A procedure can call other procedures. + +- Procedures can only be called in the RHS of declaration statements, RHS + of assignment statements or as the procedure being called in a call statement. + +- When used within a valid statement, the only legal operators which can + be applied to a procedure call are unary operators and casts. + Additionally, the result of the call may not be used in the direct construction + of a type that does not match the return type of the procedure. + +Aside from this (and the different syntax necessary to declare/define +them), procedures are very similar to functions. The extra capabilities +that procedures have makes them harder to reason about, test, and +optimize. + +.. _ssec:procedure_syntax: + +Syntax +------ + +Procedures are almost exactly the same as functions. However, because +procedures can cause side effects, the returns clause is optional. Due to +this, the ``= ;`` declaration format is not available for +procedures. For example, the following code is illegal: + +:: + + procedure f() returns integer = 1; + + +If a returns clause is present, then a return statement must be reached +by all possible control flows in the procedure before the end of the +procedure is encountered. For instance: + +:: + + procedure change_first(var integer[*] v) { + v[1] = 7; + } + + procedure increment(var integer x) { + x = x + 1; + } + + procedure fibonacci(var integer a, var integer b) returns integer { + integer c = a + b; + a = b; + b = c; + return c; + } + +These procedures can be called as follows: + +:: + + integer x = 12; + integer y = 21; + integer[5] v = 13; + + call change_first(v); /* v == [7, 13, 13, 13, 13] */ + call increment(x); /* x == 13 */ + call fibonacci(x,y); /* x == 21 and y == 34 */ + +It is only possible to call procedures in this way. Functions must +appear in expressions because they can not cause side effects, so using +a function in a ``call`` statement would not do anything. *Gazprea* +should raise an error if a function is used in a ``call`` statement. + +A procedure may never be called within a function, doing so would allow for +impure functions. Procedures may only be called within assignment statements +(procedures may not be used as the control expression in control flow expressions, for instance). +The return value from a procedure call can only be manipulated with unary +operators. It is illegal to use the results from a procedure call with +binary expressions. +For example: + +:: + + /* p is some procedure with no arguments */ + var x = p(); /* Legal */ + var y = -p(); /* Legal, depending on the return type of p */ + var z = not p(); /* Legal, depending on the return type of p */ + var u = p() + p(); /* Illegal */ + +These restrictions are made by *Gazprea* in order to allow for more +optimizations. + +Procedures without a return clause may not be used in an expression. +*Gazprea* should raise an error in such a case. +:: + + /* p is some procedure with no return clause */ + integer x = p(); /* Illegal */ + +.. _ssec:procedure_fwd_declr: + +Procedure Declarations +---------------------- + +Procedures can use :ref:`forward declaration ` +just like functions. + +.. _ssec:procedure_main: + +Main +---- + +Execution of a *Gazprea* program starts with a procedure called +``main``. This procedure takes no arguments, and has an integer return +type. ``main`` is called exclusively by the operating system, and the return value is +used by the operating system, so if you are using multiple compilation units +one and only one compilation unit must define ``main``. + +:: + + /* must be writen like this */ + procedure main() returns integer { + var integer x = 1; + x = x + x; + x -> std_output; + + /* must have a return */ + return 0; + } + +.. _ssec:procedure_alias: + +Type Promotion of Arguments +--------------------------- + +Argument types can be promoted at call time, but only if the argument is +call by value (``const``). The reason is that mutable arguments are effectively +call by reference, and are therefore *l-values* (pointers). + +:: + + + procedure byvalue(String x) returns integer { + return len(x); + } + procedure byreference(var String x) returns integer { + return len(x); + } + procedure main() returns integer { + const character[3] y = ['y', 'e', 's']; + + integer size = byvalue(y); // legal + call byreference(y); // illegal + + return 0; + } + + +Aliasing +-------- + +Since procedures can have mutable arguments, it would be possible to +cause `aliasing `__. +In *Gazprea* aliasing of mutable variables is illegal (the only case +where any aliasing is allowed is that tuple members can be accessed by +name, or by number, but this is easily spotted). This helps *Gazprea* +compilers perform more optimizations. However, the compiler must be able +to catch cases where mutable memory locations are aliased, and an error +should be raised when this is detected. For instance: + +:: + + procedure p(var integer a, var integer b, const integer c, const integer d) { + /* Some code here */ + } + + procedure main() returns integer { + var integer x = 0; + var integer y = 0; + var integer z = 0; + + /* Illegal */ + call p(x, x, x, x); /* Aliasing, this is an error. */ + call p(x, x, y, y); /* Still aliasing, error. */ + call p(x, y, x, x); /* Argument a is mutable and aliased with c and d. */ + + /* Legal */ + call p(x, y, z, z); + /* Even though 'z' is aliased with 'c' and 'd' they are both const. */ + + return 0; + } + +Whenever a procedure has a mutable argument ``x`` it must be checked that +none of the other arguments given to the procedure are ``x``. +This is simple for scalar values, but more complicated when variable arrays are +passed toprocedures. For instance: + +:: + + call p(v[x], v[y]); + /* p is some procedure with two variable array arguments */ + +It is impossible to tell whether or not these overlap at compile time +due to the halting problem. Thus for simplicity, whenever an array is passed +to a procedure *Gazprea* detects aliasing whenever the same array is used, +regardless of whether or not the access would overlap. + +Another instance of aliasing relates to tuples, such as passing the +same tuple twice in one procedure, or passing the entire tuple and +separately passing a single tuple field. In both cases this can cause +aliasing. + +:: + + call p(t1, t1.1); + /* p is some procedure with a tuple argument and a real argument */ + +.. _ssec:procedure_vec_mat: + +Array Parameters and Returns +---------------------------------------- + +:ref:`As with functions `, the arguments and return +value of procedures can have both explicit and inferred sizes. + +Similarly, slices can be used whereever arrays are declared as parameters, and +unlike functions, array parameters in procedures can be ``var``. + +.. _ssec:function_namespacing: + +Procedure Namespacing +-------------------- + +In *Gazprea* procedure declarations occur in the global scope. +This means that two procedures with the same name cannot coexist in the same +gazprea program, nor can you forward declare the same procedure twice. + +Additionally, procedures share the following namespaces: + +- The ``struct`` namespace: you cannot have a struct and function with the same + name in the same gazprea program. + +- The ``function`` namespace: You cannot have a procedure and function with + the same name in the same gazprea program. diff --git a/gazprea-clean/spec/statements.rst b/gazprea-clean/spec/statements.rst new file mode 100644 index 0000000..7ecb9f2 --- /dev/null +++ b/gazprea-clean/spec/statements.rst @@ -0,0 +1,511 @@ +.. _sec:statements: + +Statements +========== + +.. _ssec:statements_assign: + +Assignment Statements +--------------------- + +In *Gazprea* a mutable variable may have different values throughout the +execution of the program. Mutable variables may have their values changed with +an assignment statement. In the simplest case an assignment statement +contains an identifier on the left hand side of an equals sign, and an +expression with a compatible type on the right hand side. + +:: + + var integer x = 7; + + x -> std_output; /* Prints 7 */ + + /* Give 'x' a new value */ + x = 2 * 3; /* This is an assignment statement */ + + x -> std_output; /* Prints 6 */ + +Type checking must be performed on assignment statements. The expression +on the right hand side must have a type that can be automatically +promoted to the type of the variable. For instance: + +:: + + var integer int_var = 7; + var real real_var = 0.0; + var boolean bool_var = true; + + /* Since 'x' is an integer it can be promoted to a real number \*/ + real_var = int_var; /* Legal */ + + /* Real numbers can not be turned into boolean values automatically. \*/ + bool_var = real_var; /* Illegal */ + +Assignments can also be more complicated than this with arrays and tuples. +With arrays indices may be provided in order to change the value of an array +element. In Gazprea, arrays cannot be indexed with array expressions. +For instance, with single dimensional arrays: + +:: + + var integer[*] v = [0, 0, 0]; + + /* Can assign an entire array value -- change 'v' to [1, 2, 3] */ + v = [1, 2, 3]; + + /* Change 'v' to [1, 0, 3] */ + v[2] = 0; + +This applies to arrays of any dimension. + +:: + + var integer[*][*] M = [[1, 1], [1, 1]]; + + /* Change the entire matrix M to [[1, 2], [3, 4]] */ + M = [[1, 2], [3, 4]]; + + /* Change a single position of M \*/ + M[1][2] = 7; /* M is now [[1, 7], [3, 4]] */ + +Tuples also have a special unpacking syntax in *Gazprea*. A tuple’s +field may be assigned to comma separated variables instead of a tuple +variable. For instance: + +:: + + var integer x = 0; + var real y = 0; + var real z = 0; + + tuple(integer, real) tup = (1, 2.0); + + /* x == 1, and y == 2.0 now */ + x, y = tup; + + /* Types can be promoted */ + + /* z == 1.0, y == 2.0 */ + z, y = tup; + + /* Can swap: z == 2.0, y == 1.0 */ + z, y = (y, z); + +The types of the variables must match the types of the tuple’s fields, +or the tuple’s fields must be able to be automatically promoted to the +variable’s type. The number of variables in the comma separated list +must match the number of fields in the tuple, if this is not the case an +error should be raised. This assignment is performed left-to-right. + +Assignments and initializations must perform a deep copy. It should not +be possible to cause the aliasing of memory locations with an +assignment. For instance: + +:: + + integer[*] v = [1, 2, 3]; + var integer[*] w = v; + + w[2] = 0; /* This must not affect 'v' */ + + /* v has the value [1, 2, 3] */ + /* w has the value [1, 0, 3] */ + + /* If you are not careful, you might copy the pointer of 'v' to 'w', + which would cause them to be stored in the same location in memory. If + this happens modifying 'w' would change 'v' as well. + */ + +The above is a simple example using arrays. You must ensure that values +can not be aliased with an assignment between any types, including +arrays and tuples. + +Variables may be declared as const, and in this case it is illegal for +them to appear on the left hand side of an assignment expression. The +compiler should raise on error when this is detected, since it does not +make sense to change a constant value. + +The right hand side of an assignment statement is always evaluated +before the left hand side. This is important for cases where procedures +may change variables, for instance: + +:: + + v[x] = p(x); + /* If p changes x then it is important that p(x) is executed before v[x] */ + +.. _ssec:statements_block: + +Block Statements +---------------- + +A list of statements may be grouped into one statement using curly +braces. This is called a block statement, and is similar to block +statements in other languages such as *C/C++*. As an example: + +:: + + { + x = 3; + z = 4; + x -> std_output; "\n" -> std_output; z -> std_output; "\n" -> std_output; + } + +Is a block statement. Declarations can only appear at the start of a +block. Each block statement introduces a new scope that new variables +may be declared in. For instance this is perfectly valid: + +:: + + integer x = 3; + var integer y = 0; + var real z = 0; + + { + real x = 7.1; + z = x; + } + + y = x; + +After execution this ``y = 3`` and ``z = 7.1``. + +.. _ssec:statements_cond: + +If/Else Statements +------------------ + +An if statement takes a boolean value as a conditional expression, and a +statement for the body. If the conditional expression evaluates to true, +then the body is executed. If the conditional expression evaluates to +false then the body of the if statement is not executed. If statements +in *Gazprea* require the conditional expression to be enclosed in parentheses. + +:: + + integer x = 0; + var integer y = 0; + + /* Compute some value for x */ + + if (x == 3) { + y = 7; + } + + /* At this point y will only be 7 if x == 3, and otherwise y will be + 0, assuming it did not change throughout the rest of the program. + */ + +If statements are often paired with block statements, like in the above +example. The if statement above could also be written as: + +:: + + if (x == 3) + y = 7; + +Since ``y = 7;`` is a statement it can be used as the body statement. +All statements after this point are not in the body of the if statement. +For instance: + +:: + + if (x == 3) + y = 7; + z = 32; + +is actually equivalent to the following: + +:: + + if (x == 4) { + y = 7; + } + + z = 32; + +*Gazprea* is not sensitive to whitespace, so we could even write +something like: + +:: + + if (x == 3) y = 7; + +An if statement may also be followed by an else statement. The else has +a body statement just like the if statement, but this is only run if the +conditional expression on the if statement fails. + +:: + + if (x == 3) + y = 7; + else + y = 32; + +Now if ``x`` does not have a value of 3, ``y`` is assigned a value of +32. This can be paired with if statements as well. + +:: + + y = 0; + + if (x < 0) { + y = -1; + } + else if (x > 0) { + y = 1; + } + + /* y is negative if x is negative, positive if x is positive, + and 0 if x is 0. */ + +.. _ssec:statements_loop: + +Loop +---- + +.. _sssec:statements_inf_Loop: + +Infinite Loop +~~~~~~~~~~~~~ + +*Gazprea* provides an infinite loop, which continuously executes the +body statement given to it. For instance: + +:: + + loop "hello!\n" -> std_output; + +Would print "hello!" indefinitely. This is often used with block +statements. + +:: + + /* Infinite counter */ + var integer n = 0; + + loop { + n -> std_output; "\n" -> std_output; + n = n + 1; + } + +.. _sssec:statements_pred_loop: + +Predicated Loop +~~~~~~~~~~~~~~~ + +A loop may also be provided with a control expression. The control +expression automatically breaks from the loop if it evaluates to false +when it is checked. + +The loop can be pre-predicated, which means that the control expression +is tested before the body statement is executed. This is the same +behaviour as while loops in most languages, and is written using the +``while`` token after the ``loop``, followed by a boolean expression for the +predicate. For example: + +:: + + var integer x = 0; + + /* Print 1 to 10 */ + loop while (x < 10) { + x = x + 1; + x -> std_output; "\n" -> std_output; + } + +A post-predicated loop is also available. In this case the control +expression is tested after the body statement is executed. This also +uses the ``while`` token followed by the control expression, but it appears +at the end of the loop. Post Predicated loop statements must end in a +semicolon. + +:: + + integer x = 10; + + /* Since the conditional is tested after the execution '10' is printed */ + loop x -> std_output; while (x == 0); + +.. _sssec:statements_iter_loop: + +Iterator Loop +~~~~~~~~~~~~~ + +Loops can be used to iterate over the elements of an array of any type. +This is done by using domain expressions (for instance ``i in v``) in +conjunction with a loop statement. + +When the domain is given by an array, each time the loop is executed the +next element of the array is assigned to the domain variable. The +elements of the domain array are assigned to the domain variable +starting from index 1, and going up to the final element of the array. +When all of the elements of the domain array have been used the loop +automatically exits. For instance: + +:: + + /* This will print 123 */ + loop i in [1, 2, 3] { + i -> std_output; + } + +Array ranges can also be used instead: + +:: + + // This will print 123 + loop i in 1..3 { + i -> std_output; + } + +The domain is evaluated once during the first iteration of the loop. For +instance: + +:: + + var integer[*] v = [i in 1..3 | i]; + + /* Since the domain 'v' is only evaluated once this loop prints 1, 2, + and then 3 even though after the first iteration 'v' is the zero + array. */ + loop i in v { + v = 0; + i -> std_output; "\n" -> std_output; + } + +Similarly, the domain variable is assigned from the domain array at the top of +the loop for every iteration, even if it is reassigned in the body of the loop: + +:: + + // This will print 123456 + loop i in 1..6 { + i -> std_output; + i = 5; + } + +Note that multiple domain expressions are *not* allowed: + +:: + + // This is illegal + loop i in u, j in v { + "Hello!\n" -> std_output; + } + + // If you want multiple domains, use a nested loop + loop i in u { + loop j in v { + "Hello!\n" -> std_output; + } + } + +.. _ssec:statements_break: + +Break +----- + +A ``break`` statement may only appear within the body of a loop. When a +``break`` statement is executed the loop is exited, and *Gazprea* continues +to execute after the loop. This only exits the innermost loop, which +actually contains the ``break``. + +:: + + /* Prints a 3x3 square of *'s */ + integer x = 0; + var integer y = 0; + + loop while (y < 3) { + y = y + 1; + + /* Normally this would loop forever, but the break exits this inner loop */ + loop { + if (x >= 3) break; + + x = x + 1; + "*" -> std_output; + } + + "\n" -> std_output; + } + +If a ``break`` statement is not contained within a loop an error must be +raised. + +.. _ssec:statements_continue: + +Continue +-------- + +Similarly to ``break``, ``continue`` may only appear within the body of +a loop. When a ``continue`` statement is executed the innermost loop +that contains the ``continue`` statements starts its next iteration. +``continue`` stops the execution of the loop’s body statement, the loop +then continues as though the body statement finished its execution +normally. + +:: + + /* Prints every number between 1 and 10, except for 7 */ + var integer x = 0; + + loop while (x < 10) { + x = x + 1; + + if (x == 7) continue; /* Start at the beginning of the loop, skip 7 */ + + x -> std_output; "\n" -> std_output; + } + +.. _ssec:statements_return: + +Return +------ + +The ``return`` statement is used to stop the execution of a function or +procedure. When a function/procedure returns then execution continues where the +function/procedure was called. + +If the function/procedure has a return type then the ``return`` statement must +be given a value that is the same as or able to be promoted to (see +:ref:`sec:typePromotion`) the return type; this will be the result of the +function/procedure call. Here is an example: + +:: + + function square(integer x) returns integer { + return x * x; + } + +If a procedure has no ``returns`` clause, then it has no return type and a +``return`` statement is not required but may still be present in order to +return early. In this case return is used as follows: + +:: + + procedure do_nothing() { + return; + } + +.. _ssec:statements_streams: + +Stream Statements +----------------- + +Stream statements are the statements used to read and write values in +*Gazprea*. + +Output example: + +:: + + 2 * 3 -> std_output; /* Prints 6 */ + +Input example: + +:: + + integer x; + x <- std_input; /* Read an integer into x */ diff --git a/gazprea-clean/spec/streams.rst b/gazprea-clean/spec/streams.rst new file mode 100644 index 0000000..610ca35 --- /dev/null +++ b/gazprea-clean/spec/streams.rst @@ -0,0 +1,259 @@ +.. _sec:streams: + +Streams +======= + +*Gazprea* has two streams: ``std_output`` and ``std_input``, +which are used for writting to `stdout` and reading from `stdin` respectively. + + +.. _ssec:output: + +Output Stream +------------- + +Output streams use the following syntax: + +:: + + -> std_output; + +.. _sssec:output_format: + +Output Format +~~~~~~~~~~~~~ + +Values of the following base types are treated as follows when sent to +an output stream: + +- :ref:`ssec:character`: The character is printed. + +- :ref:`ssec:integer`: Converted to a string representation, and then printed. + +- :ref:`ssec:real`: Converted to a string representation, and then printed. + This is the same behaviour as the `%g specifier in + printf `__. + +- :ref:`ssec:boolean`: Prints T for true, and F for false. + +:ref:`Arrays ` print their contents according to the rules above, with square +braces surrounding its elements and with spaces only *between* values. +For example: + +:: + + integer[*] v = 1..3; + v -> std_output; + +prints the following: + +:: + + [1 2 3] + +:ref:`strings ` print their contents as a contiguous sequence of characters. +For example: + +:: + + string str = "Hello, World!"; + str -> std_output; + +prints the following: + +:: + + Hello, World! + +:ref:`Matrices ` print like an array of arrays. For example: + +:: + + [[1, 2, 3], [4, 5, 6], [7, 8, 9]] -> std_output; + +prints the following: + +:: + + [[1 2 3] [4 5 6] [7 8 9]] + +No other type may be sent to a stream. For instance, +procedures with no return type and tuples cannot be sent to streams. +Also, empty arrays and matrices can be send to streams, but not empty +literals (e.g. ``[]``), because they have no type. + +Note that there is **no automatic new line or spaces printed.** To print +a new line, a user must explicitly print the new line or space +character. For example: + +:: + + '\n' -> std_output; + ' ' -> std_output; + +.. _ssec:input: + +Input Stream +------------ + +Input streams use the following syntax: + +:: + + <- std_input; + +An l-value may be anything that can appear on the left hand side of an +assignment statement. Consider reading the discussion of an l-value +`here `__. + +Input streams may only work on the following base types: + +- ``character``: Reads a single character from stdin. Note that there + can be no :ref:`error state ` for reading characters. + +- ``integer``: Reads an integer from stdin. If an integer could not be + read, an :ref:`error state ` is set on this stream. + +- ``real``: Reads a real from stdin. If a real could not be read, an :ref:`error state ` is + set on this stream. + +- ``boolean``: Reads a boolean from stdin. If a boolean value could not + be read, an :ref:`error state ` is set on this stream. + +Type promotion is not performed for stream input over any type. + + .. _sssec:input_format: + +Input Semantics +~~~~~~~~~~~~~~~ + +``std_input`` expects an input stream of values which do not need to be +whitespace separated. A read will consume the stream until a character or +EOF occurs that breaks the pattern match for the given types specifier. The longest +successful match is returned. + +In general input stream semantics are designed for parity with ``scanf``. +The only differences are the :ref:`ssec:builtIn_stream_state`, a boolean specifier +and a restriction on the maximum number of bytes that can be consumed in a single read to 512. + +For each of the allowed types the semantics are given below. + +Reading a ``character`` from stdin consumes the first byte that can be read from the +stream. If the end of the stream is encountered, then a value of ``-1`` is set. There +is no concept of skipping whitespace for characters, since space and escaped characters +must be readable. + +An ``integer`` from stdin can take any legal format described in the +:ref:`integer literal ` section. It may also be preceded by +a single negative or positive sign. All preceeding whitespace before the number or +sign character may be skipped up to the limit imposed by the 512 byte read restriction. + +A ``real`` input from stdin can take any legal format described in the +:ref:`real literal ` section with the exception that no +whitespace may be present. It may also be proceeded by a single negative or +positive sign. Preceeding whitespace may be skipped in the same way as integers. + +A ``boolean`` input from stdin is either ``T`` or ``F``. Preceeding whitespace may be +skipped in the same way as integers and reals. + +For the following program: + +:: + + var boolean b; + var character c; + var integer i; + var real r; + b <- std_input; + i <- std_input; + c <- std_input; + r <- std_input; + format(b) || " " || format(r) -> std_output; + +And this input (where '\\t' is TAB, '*' is space, and each line ends with a +newline ('\\n'): + +:: + + \tF\n + 1\n + *1.\n + +The output would be: + +:: + + F 1.0 + +because the white space is consumed for characters and skipped for other types. + + +.. _sssec:stream_error: + +Error Handling +~~~~~~~~~~~~~~ + +When reading ``boolean``, ``integer``, and ``real`` from stdin, it is +possible that the end of the stream or an error is encountered. In order to +handle these situations *Gazprea* provides a built in procedure that is +implicitly defined in every file: ``stream_state`` (see +:ref:`ssec:builtIn_stream_state`). + +Reading a ``character`` can never cause an error. The character will either be +successfully read or the end of the stream will be reached and ``-1`` will be +returned on this read. + +When an error occurs the the null value is assigned and the input stream +remains pointing to the same position as before the read occured. + +The program below demonstrates 4 reads which set the error +states 1,0,0,2 respectively. + +:: + + var integer ss; + var integer i; + var boolean b; + var character c; + + i <- std_input; + i -> std_output; + ss = stream_state(std_input); + ss -> std_output; + + c <- std_input; //eat the . + + i <- std_input; + i -> std_output; + + c <- std_input; + ss = stream_state(std_input); + ss -> std_output; + +With the input stream: + +:: + + .7 + +And the expected output: + +:: + + 0172 + +This table summarizes an input stream’s possible error states after a read of a +particular data type. + +========= ============= ========= ================= +Type Situation Return ``stream_state`` +========= ============= ========= ================= +Boolean error ``false`` 1 +\ end of stream ``false`` 2 +Character error N/A N/A +\ end of stream ``-1`` 2 +Integer error ``0`` 1 +\ end of stream ``0`` 2 +Real error ``0.0`` 1 +\ end of stream ``0.0`` 2 +========= ============= ========= ================= diff --git a/gazprea-clean/spec/type_casting.rst b/gazprea-clean/spec/type_casting.rst new file mode 100644 index 0000000..bddd522 --- /dev/null +++ b/gazprea-clean/spec/type_casting.rst @@ -0,0 +1,126 @@ +.. _sec:typeCasting: + +Type Casting +============ + +*Gazprea* provides explicit type casting. Type casting is an expression. +A value may be converted to a +different type using the following syntax where ``value`` is an +expression and ``toType`` is our destination type: + +:: + + as(value) + +Conversion from one type to another is not always legal. For instance +converting from an ``integer`` array to an ``integer`` has no +reasonable conversion. + +.. _ssec:typeCasting_stos: + +Scalar to Scalar +---------------- + +This table summarizes all of the conversion rules between scalar types +where N/A means no conversion is possible, id means no change is +necessary, and anything else describes how to convert the value to the +new type: + ++----------+-------------------------------------------------------------------------------------------------------------------------------------+ +| | **To type** | ++----------+-----------+--------------------------------+--------------------------------+--------------------------+----------------------------+ +| | | boolean | character | integer | real | +| +-----------+--------------------------------+--------------------------------+--------------------------+----------------------------+ +| | boolean | id | ‘\\0’ if false, 0x01 otherwise | 1 if true, 0 otherwise | 1.0 if true, 0.0 otherwise | +| +-----------+--------------------------------+--------------------------------+--------------------------+----------------------------+ +| **From** | character | false if ‘\\0’, true otherwise | id | *ASCII* value as integer | *ASCII* value as real | +| +-----------+--------------------------------+--------------------------------+--------------------------+----------------------------+ +| **type** | integer | false if 0, true otherwise | unsigned integer value mod 256 | id | real version of integer | +| +-----------+--------------------------------+--------------------------------+--------------------------+----------------------------+ +| | real | N/A | N/A | truncate | id | ++----------+-----------+--------------------------------+--------------------------------+--------------------------+----------------------------+ + +.. _ssec:typeCasting_stovm: + +Scalar to Array +----------------------- + +A scalar may be promoted to an array of any dimension with an element type that +the original scalar can be cast to according to the rules in :ref:`ssec:typeCasting_stos`. +A scalar to array cast *must* include a size with the type to cast to as this +cannot be inferred from the scalar value. For example: + +:: + + // Create an array of reals with length three where all values are 1.0. + real[*] v = as(1); + + // Create an array of booleans with length 10 where all values are true. + var u = as('c'); + +.. _ssec:typeCasting_vtov: + +Array to Array +---------------- + +Conversions between array types are also possible. First, the +values of the original are cast to the destination type’s element type +according to the rules in :ref:`ssec:typeCasting_stos` and then the destination +is padded with destination element type’s zero or truncated to match the +destination type size. Note that the size is not required for array to +array casting; if the size is not included in the cast type, the new +size is assumed to be the old size. For example: + +:: + + real[3] v = [i in 1..3 | i + 0.3 * i]; + + // Convert the real array to an integer array. + integer[3] u = as(v); + + // Convert to integers and zero pad. + integer[5] x = as(v); + + // Truncate the array. + real[2] y = as(v); + +Casting non-variable empty arrays ``[]`` is not allowed, because a literal +empty array does not have a type. + +.. _ssec:typeCasting_mtom: + +Multi-dimensional Arrays +------------------------ + +Conversions between arrays of any dimension are possible. +The process is exactly like :ref:`ssec:typeCasting_vtov` except padding and +truncation can occur in all dimensions. For example: + +:: + + real[2][2] a = [[1.2, 24], [-13e2, 4.0]]; + + // Convert to an integer matrix. + integer[2][2] b = as(a); + + // Convert to integers and pad in both dimensions. + integer[3][3] c = as(a); + + // Truncate in one dimension and pad in the other. + real[1][3] d = as(a); + real[3][1] e = as(a); + +.. _ssec:typeCasting_ttot: + +Tuple to Tuple +-------------- + +Conversions between ``tuple`` types are also possible. The original type +and the destination type must have an equal number of internal types and +each element must be pairwise castable according to the rules +in :ref:`ssec:typeCasting_stos`. For example: + +:: + + tuple(integer, integer) int_tup = (1, 2); + tuple(real, boolean) rb_tup = as(int_tup); diff --git a/gazprea-clean/spec/type_inference.rst b/gazprea-clean/spec/type_inference.rst new file mode 100644 index 0000000..8877704 --- /dev/null +++ b/gazprea-clean/spec/type_inference.rst @@ -0,0 +1,48 @@ +.. _sec:typeInference: + +Type Inference +============== + +In many cases the compiler can figure out what a variable’s type, or a +function’s return type, should be without an explicit type being +provided. For instance, instead of writing: + +:: + + integer x = 2; + const integer y = x * 2; + +*Gazprea* allows you to just write: + +:: + + var x = 2; + const y = x * 2; + +This is allowed because the compiler knows that the initialization +expression, 2, has the type integer. Because of this the compiler can +automatically give x an integer type. A *Gazprea* programmer can use +``var`` or ``const`` for any declaration with an initial value +expression, as long as the compiler can guess the type for the +expression. + +Note that although the qualifier may be elided (default is ``const``) and the +type may be elided (inferred from the RHS), it is not legal to imply both: + +:: + + x = 2; // assignment or declaration? + +Interpreted as a declaration, the full form would be ``const integer x = 2;``. +However, with both the modifier and type assumed we can't differentiate this +declaration from an assignment statement. To prevent this ambiguity, we require +at least one of the qualifier or the type to be present: + +:: + + const integer x = 2; // full form - legal + integer x = 2; // defaults to const - legal + var x = 2; // infers integer - legal + x = 2; // assignment to undeclared variable? - illegal + var x; // can't infer type - illegal + integer x; // const integer initialized to 0 - legal diff --git a/gazprea-clean/spec/type_promotion.rst b/gazprea-clean/spec/type_promotion.rst new file mode 100644 index 0000000..e22446a --- /dev/null +++ b/gazprea-clean/spec/type_promotion.rst @@ -0,0 +1,129 @@ +.. _sec:typePromotion: + +Type Promotion +============== + +Type promotion is a sub-problem of casting and refers to casts that happen +implicitly. + +Any conversion that can be done implicitly via promotion can also be done +explicitly via typecast expression. +The notable exception is array promotion to a higher dimension, which occurs as +a consequence of scalar to array promotion. + +.. _ssec:typePromotion_scalar: + +Scalars +------- + +The only automatic type promotion for scalars is ``integer`` to +``real``. This promotion is one way - a ``real`` cannot be automatically +converted to ``integer``. + +Automatic type conversion follows this table where N/A means no implicit +conversion possible, id means no conversion necessary, +``as(var)`` means var of type "From type" is converted to type +"toType" using semantics from . + ++----------+-----------+---------+-----------+---------+---------------+ +| | **To type** | ++----------+-----------+---------+-----------+---------+---------------+ +| | | boolean | character | integer | real | ++ +-----------+---------+-----------+---------+---------------+ +| **From** | boolean | id | N/A | N/A | N/A | ++ +-----------+---------+-----------+---------+---------------+ +| **type** | character | N/A | id | N/A | N/A | ++ +-----------+---------+-----------+---------+---------------+ +| | integer | N/A | N/A | id | as(var) | ++ +-----------+---------+-----------+---------+---------------+ +| | real | N/A | N/A | N/A | id | ++----------+-----------+---------+-----------+---------+---------------+ + +.. _ssec:typePromotion_stoa: + +Scalar to Array +-------------------------- + +All scalar types can be promoted to arrays that have an internal type that the +scalar can be :ref:`converted to implicity `. +This can occur when an array is used in an operation with a scalar value. + +The scalar will be implicitly converted to an array of +equivalent dimensions and equivalent internal type. For example: + +:: + + integer i = 1; + integer[*] v = [1, 2, 3, 4, 5]; + integer[*] res = v + i; + + res -> std_output; + +would print the following: + +:: + + [2 3 4 5 6] + +Other examples: + +:: + + 1 == [1, 1] // True + 1..2 || 3 // [1, 2, 3] + +Note that an array can never be downcast to a scalar, +even if type casting is used. Also note that matrix multiply imposes strict +requirements on the dimensionality of the the operands. The consequence is +that scalars can only be promoted to a matrix if the matrix multiply +operand is a square matrix (:math:`m \times m`). + +Tuple to Tuple +-------------- + +Tuples may be promoted to another tuple type if it has an equal number of +internal types and the original internal types can be implicitly +converted to the new internal types. For example: + +:: + + tuple(integer, integer) int_tup = (1, 2); + tuple(real, real) real_tup = int_tup; + + tuple(char, integer, boolean[2]) many_tup = ('a', 1, [true, false]); + tuple(char, real, boolean[2]) other_tup = many_tup; + +If initializing a variable with a tuple via :ref:`sec:typeInference`, the +variable is assumed to be the same type. +Therefore, tuple elements also copied accordingly. For example: + +:: + + tuple(real, real) foo = (1, 2); + tuple(real, real) bar = (3, 4); + + var baz = foo; + baz.1 -> std_output; // 1 + baz.2 -> std_output; // 2 + + baz = bar; + baz.1 -> std_output; // 3 + baz.2 -> std_output; // 4 + + +It is possible for a two sided promotion to occur with tuples. For example: + +:: + + boolean b = (1.0, 2) == (2, 3.0); + +Character Array to/from String +------------------------------- + +A ``string`` can be implicitly converted to an array of ``character``\ s and vice-versa (two-way type promotion). + +:: + + string str1 = "Hello"; /* str1 == "Hello" */ + character[*] chars = str1; /* chars == ['H', 'e', 'l', 'l', 'o'] */ + string str2 = chars || [' ', 'W', 'o', 'r', 'l', 'd']; /* str2 == "Hello World" */ diff --git a/gazprea-clean/spec/type_qualifiers.rst b/gazprea-clean/spec/type_qualifiers.rst new file mode 100644 index 0000000..a6eed73 --- /dev/null +++ b/gazprea-clean/spec/type_qualifiers.rst @@ -0,0 +1,66 @@ +.. _sec:typeQualifiers: + +Type Qualifiers +=============== + +*Gazprea* has two type qualifiers: ``const`` and ``var``. These +qualifers can prefix a type to specify its mutability or entirely +replace the type to request that it be inferred. Mutability refers to a +values ability to be an `r-value or +l-value `__. +The two qualifiers cannot be combined as they are mutually exclusive. + +.. _ssec:typeQualifiers_const: + +Const +----- + +A ``const`` value is immutable and therefore cannot be an l-value but +can be an r-value. For example: + +:: + + const integer i; + +Because a ``const`` value is not an l-value, it cannot be passed to a +``var`` argument in a ``procedure``. + +Note that ``const`` is the default *Gazprea* behaviour and is essentially a +no-op unless it is entirely replacing the type. + + +.. _ssec:typeQualifiers_var: + +Var +--- + +A ``var`` value is mutable and therefore can be an l-value or r-value. +For example: + +:: + + var integer i; + +The compiler should raise an error if an attempt is made to modify a variable +that is not explicitly declared ``var``. + +.. _ssec:typeQualifiers_infer: + +Type Inference Using Qualifiers +------------------------------- + +Type qualifiers may be used in place of a type, in which case the real +type must be inferred. A variable declared in this manner must be +**immediately initialised** to enable inference. For example: + +:: + + var i = 1; // integer + const i = 1; // integer + var r = 1.0; // real + const c = 'a'; // character + var t = (1, 2, 'a', [1, 2, 3]); // tuple(integer, integer, character, integer[3]) + const v = ['a', 'b', 'c', 'd']; // character[4] + +See :ref:`sec:typeInference` for a larger description of type inference, this section only +provides the syntax for inference using ``const`` and ``var``. diff --git a/gazprea-clean/spec/typedef.rst b/gazprea-clean/spec/typedef.rst new file mode 100644 index 0000000..754edad --- /dev/null +++ b/gazprea-clean/spec/typedef.rst @@ -0,0 +1,78 @@ +.. _sec:typealias: + +Typealias +========= + +Custom names for types can be defined using ``typealias``. Type aliases may only +appear at global scope, they may not appear within functions or procedures. A +type alias may use any valid identifier for the name of the type. After the type +alias has been defined any global declaration or function defined may use the +new name to refer to the old type. For instance: + +:: + + typealias integer int; + const int a = 0; + +Note that hese new type names can *appear* to conflict with symbol names. +However, the compiler can use context to differentiate a type alias from a +symbol. The following is therefore legal: + +:: + + typealias character main; + typealias integer i; + + const main A = 'A'; + + procedure main() returns i { + i i = 0; // = ; + return i; + } + +In addition to base types, ``typealias`` can be used with compound types +(arrays, vectors, and strings) and aggregate types (structs and tuples). +Using ``typealias`` on tuples, or on arrays with sizes helps reusability and +consistency: + +:: + + typealias tuple(character[64], integer, real) student_id_grade; + student_id_grade chucky_cheese = ("C. Cheese", 123456, 77.0); + + typealias integer[2][3] two_by_three_matrix; + two_by_three_matrix m = [i in 1..2, j in 1..3 | i + j]; + +Type aliases of arrays with inferred sizes are allowed, but declarations +of variables using the type alias must be initialized appropriately. + +Because a ``typealias`` is an aliased name for a type, you can use +``typealias`` on type alias'ed types: + +:: + + typealias integer int; + typealias int also_int; + +Duplicate alias names should raise a `SymbolError` + +:: + + typealias integer ty; + typealias character ty; + +Some type aliases may be parameterized with an expression, such as with arrays, +such expressions are restricted to be composed exclusively from arithmetic +operations on scalar literals. Practically speaking, this requires constant +folding but *not* constant propogation. + +:: + + typealias integer[1 + 3 - 2] vec_of_two; + procedure main() returns integer { + vec_of_two v = 1..3; + } + +Should raise a ``SizeError`` on line 3 since the ``vec_of_two`` type has a size +of 2 and an array of size 3 is being assigned. + diff --git a/gazprea-clean/spec/types/boolean.rst b/gazprea-clean/spec/types/boolean.rst new file mode 100644 index 0000000..aa3a00d --- /dev/null +++ b/gazprea-clean/spec/types/boolean.rst @@ -0,0 +1,80 @@ +.. _ssec:boolean: + +Boolean +------- + +A ``boolean`` is either ``true`` or ``false``. A ``boolean`` can be +represented by an ``i1`` in *MLIR*. + +.. _sssec:boolean_decl: + +Declaration +~~~~~~~~~~~ + +A ``boolean`` value is declared with the keyword ``boolean``. +If the variable is not initialized explicitly, it is set to ``false`` (zero). + +.. _sssec:boolean_lit: + +Literals +~~~~~~~~ + +The following are the only two valid ``boolean`` literals: + +- ``true`` + +- ``false`` + +.. _sssec:boolean_ops: + +Operations +~~~~~~~~~~ + +The following operations are defined on ``boolean`` values. In all +of the usage examples ``bool-expr`` means some ``boolean`` yielding +expression. + +============= ========== =========================== ================= +**Operation** **Symbol** **Usage** **Associativity** +============= ========== =========================== ================= +parenthesis ``()`` ``(bool-expr)`` N/A +negation ``not`` ``not bool-expr`` right +logical or ``or`` ``bool-expr or bool-expr`` left +logical xor ``xor`` ``bool-expr xor bool-expr`` left +logical and ``and`` ``bool-expr and bool-expr`` left +equals ``==`` ``bool-expr == bool-expr`` left +not equals ``!=`` ``bool-expr != bool-expr`` left +============= ========== =========================== ================= + +Unlike many languages the ``and`` and ``or`` operators do not `short +circuit +evaluation `__. +Therefore, both the left hand side and right hand side of an expression +must always be evaluated. + +This table specifies ``boolean`` operator precedence. Operators without +lines between them have the same level of precedence. + ++----------------+---------------+ +| **Precedence** | **Operation** | ++================+===============+ +| HIGHER | ``not`` | ++----------------+---------------+ +| | ``==`` | +| | | +| | ``!=`` | ++----------------+---------------+ +| | ``and`` | ++----------------+---------------+ +| | ``or`` | +| | | +| LOWER | ``xor`` | ++----------------+---------------+ + + +Type Casting and Type Promotion +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To see the types that ``boolean`` may be cast and/or promoted to, see +the sections on :ref:`sec:typeCasting` and :ref:`sec:typePromotion` +respectively. diff --git a/gazprea-clean/spec/types/character.rst b/gazprea-clean/spec/types/character.rst new file mode 100644 index 0000000..8fc00a4 --- /dev/null +++ b/gazprea-clean/spec/types/character.rst @@ -0,0 +1,82 @@ +.. _ssec:character: + +Character +--------- + +A ``character`` is a signed 8-bit value. A ``character`` can be +represented by an ``i8`` in *MLIR*. + +.. _sssec:character_decl: + +Declaration +~~~~~~~~~~~ + +A ``character`` value is declared with the keyword ``character``. + +.. _sssec:character_lit: + +Literals and Escape Sequences +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +A ``character`` literal is written in the same manner as *C99*: a single +character enclosed in single quotes. For example: + +:: + + 'a' + 'b' + 'A' + '1' + '.' + '*' + +As in *C99*, *Gazprea* supports character escape sequences for common +characters. For example: + +:: + + '\0' + '\n' + +The following escape sequences are supported by *Gazprea*: + +=============== =================== =============== +**Description** **Escape Sequence** **Value (Hex)** +=============== =================== =============== +Null ``\0`` ``0x00`` +Bell ``\a`` ``0x07`` +Backspace ``\b`` ``0x08`` +Tab ``\t`` ``0x09`` +Line Feed ``\n`` ``0x0A`` +Carriage Return ``\r`` ``0x0D`` +Quotation Mark ``\"`` ``0x22`` +Apostrophe ``\'`` ``0x27`` +Backslash ``\\`` ``0x5C`` +=============== =================== =============== + +.. _sssec:character_ops: + +Operations +~~~~~~~~~~ + +The following operations are defined between ``character`` values. + ++------------+--------------------------+------------+---------------------------+-------------------+ +| **Class** | **Operation** | **Symbol** | **Usage** | **Associativity** | ++============+==========================+============+===========================+===================+ +| Grouping | parentheses | ``()`` | ``(character)`` | N/A | ++------------+--------------------------+------------+---------------------------+-------------------+ +| Comparison | equals | ``==`` | ``character == character``| left | +| +--------------------------+------------+---------------------------+-------------------+ +| | not equals | ``!=`` | ``character != character``| left | ++------------+--------------------------+------------+---------------------------+-------------------+ + +Scalar values with type ``character`` may be concatenated onto +variables with type ``string`` or arrays with type ``character``. + +Type Casting and Type Promotion +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To see the types that ``character`` may be cast and/or promoted to, see +the sections on :ref:`sec:typeCasting` and :ref:`sec:typePromotion` +respectively. diff --git a/gazprea-clean/spec/types/integer.rst b/gazprea-clean/spec/types/integer.rst new file mode 100644 index 0000000..094669e --- /dev/null +++ b/gazprea-clean/spec/types/integer.rst @@ -0,0 +1,120 @@ +.. _ssec:integer: + +Integer +------- + +An ``integer`` is a signed 32-bit value. An ``integer`` can be +represented by an ``i32`` in *MLIR*. + +.. _sssec:integer_decl: + +Declaration +~~~~~~~~~~~ + +A ``integer`` value is declared with the keyword ``integer``. + +.. _sssec:integer_lit: + +Literals +~~~~~~~~ + +An ``integer`` literal is specified in base 10. For example: + +:: + + 1234 + 2 + 0 + +.. _sssec:integer_ops: + +Operations +~~~~~~~~~~ + +The following operations are defined between ``integer`` values. In all +of the usage examples ``int-expr`` means some ``integer`` yielding +expression. + ++------------+--------------------------+------------+--------------------------+-------------------+ +| **Class** | **Operation** | **Symbol** | **Usage** | **Associativity** | ++============+==========================+============+==========================+===================+ +| Grouping | parentheses | ``()`` | ``(int-expr)`` | N/A | ++------------+--------------------------+------------+--------------------------+-------------------+ +| Arithmetic | addition | ``+`` | ``int-expr + int-expr`` | left | +| +--------------------------+------------+--------------------------+-------------------+ +| | subtraction | ``-`` | ``int-expr - int-expr`` | left | +| +--------------------------+------------+--------------------------+-------------------+ +| | multiplication | ``*`` | ``int-expr * int-expr`` | left | +| +--------------------------+------------+--------------------------+-------------------+ +| | division | ``/`` | ``int-expr / int-expr`` | left | +| +--------------------------+------------+--------------------------+-------------------+ +| | remainder | ``%`` | ``int-expr % int-expr`` | left | +| +--------------------------+------------+--------------------------+-------------------+ +| | exponentiation | ``^`` | ``int-expr ^ int-expr`` | right | +| +--------------------------+------------+--------------------------+-------------------+ +| | unary negation | ``-`` | ``- int-expr`` | right | +| +--------------------------+------------+--------------------------+-------------------+ +| | unary plus (no-op) | ``+`` | ``+ int-expr`` | right | ++------------+--------------------------+------------+--------------------------+-------------------+ +| Comparison | less than | ``<`` | ``int-expr < int-expr`` | left | +| +--------------------------+------------+--------------------------+-------------------+ +| | greater than | ``>`` | ``int-expr > int-expr`` | left | +| +--------------------------+------------+--------------------------+-------------------+ +| | less than or equal to | ``<=`` | ``int-expr <= int-expr`` | left | +| +--------------------------+------------+--------------------------+-------------------+ +| | greater than or equal to | ``>=`` | ``int-expr >= int-expr`` | left | +| +--------------------------+------------+--------------------------+-------------------+ +| | equals | ``==`` | ``int-expr == int-expr`` | left | +| +--------------------------+------------+--------------------------+-------------------+ +| | not equals | ``!=`` | ``int-expr != int-expr`` | left | ++------------+--------------------------+------------+--------------------------+-------------------+ + +Unary negation produces the additive inverse of the ``integer`` +expression. Unary plus always produces the same result as the +``integer`` expression it is applied to. Remainder mirrors the behaviour +of remainder in *C99*. + +This table specifies ``integer`` operator precedence. Operators without +lines between them have the same level of precedence. Note that +parentheses are not included in this list because they are used to +override precedence and create new atoms in an expression. + ++----------------+----------------+ +| **Precedence** | **Operations** | ++================+================+ +| HIGHER | ``unary +`` | +| | | +| | ``unary -`` | ++----------------+----------------+ +| | ``^`` | ++----------------+----------------+ +| | ``*`` | +| | | +| | ``/`` | +| | | +| | ``%`` | ++----------------+----------------+ +| | ``+`` | +| | | +| | ``-`` | ++----------------+----------------+ +| | ``<`` | +| | | +| | ``>`` | +| | | +| | ``<=`` | +| | | +| | ``>=`` | ++----------------+----------------+ +| | ``==`` | +| | | +| LOWER | ``!=`` | ++----------------+----------------+ + + +Type Casting and Type Promotion +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To see the types that ``integer`` may be cast and/or promoted to, see +the sections on :ref:`sec:typeCasting` and :ref:`sec:typePromotion` +respectively. diff --git a/gazprea-clean/spec/types/real.rst b/gazprea-clean/spec/types/real.rst new file mode 100644 index 0000000..45d0b78 --- /dev/null +++ b/gazprea-clean/spec/types/real.rst @@ -0,0 +1,67 @@ +.. _ssec:real: + +Real +---- + +A ``real`` is an IEEE 754 32-bit floating point value. A ``real`` can be +represented by a ``f32`` in *MLIR*. + +.. _sssec:real_decl: + +Declaration +~~~~~~~~~~~ + +A ``real`` value is declared with the keyword ``real``. + +.. _sssec:real_lit: + +Literals +~~~~~~~~ + +A ``real`` literal can be specified in several ways. A leading zero is +not necessary and can be inferred from a leading decimal point. Likewise, +a trailing zero is not necessary and can be inferred from a trailing +decimal point. However, at least one digit must be present in order to be +parsed. For example: + +:: + + 42.0 + 42. + 4.2 + 0.42 + .42 + . // Illegal. + +A ``real`` literal can also be created by any valid ``real`` or +``integer`` literal followed by scientific notation indicated by the +character ``e`` or ``E`` and another valid ``integer`` literal. Scientific notation +multiplies the first literal by :math:`{10}^{x}`. For example, +:math:`4.2\mathrm{e}{-3}=4.2 \times10^{-3}`. For example: + +:: + + 4.2e-1 + 4.2e+9 + 4.2E5 + 42.e+37 + .42e-7 + 42E6 + +.. _sssec:real_ops: + +Operations +~~~~~~~~~~ + +Floating point operations and precedence are equivalent to :ref:`integer operation and precedence `. + +Operations on real numbers should adhere to the IEEE 754 spec with +regards to the representation of not-a-number(NaNs), infinity(infs), and +zeros. + +Type Casting and Type Promotion +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To see the types that ``real`` may be cast and/or promoted to, see +the sections on :ref:`sec:typeCasting` and :ref:`sec:typePromotion` +respectively. diff --git a/gazprea-clean/spec/types/string.rst b/gazprea-clean/spec/types/string.rst new file mode 100644 index 0000000..e3d76a4 --- /dev/null +++ b/gazprea-clean/spec/types/string.rst @@ -0,0 +1,97 @@ +.. _ssec:string: + +String +------ + +A ``string`` is another object within *Gazprea*. Fundamentally, a ``string`` is +a ``vector`` of ``character``. +This means that, like a vector, a string behaves like a dynamically sized array, +but because it is an object *Gazprea* can provide type specific features. + +String vectors behave a lot like character arrays, but there are several +differences between the two types: +an :ref:`extra literal style `, +the :ref:`result of a concatenation ` +and :ref:`behaviour when sent to an output stream `. + +.. _sssec:string_decl: + +Declaration +~~~~~~~~~~~ + +A string may be declared with the keyword ``string``. The same rules of +:ref:`vector declarations ` also apply to strings, which means +that all lenghts are inferred: + +:: + + string = ; + +.. _sssec:string_lit: + +Literals +~~~~~~~~ + +Strings can be constructed in the same way as arrays using character literals. +*Gazprea* also provides a special syntax for string literals. A string literal +is any sequence of character literals (including escape sequences) in between +double quotes. For instance: + +:: + + string cats_meow = "The cat said \"Meow!\"\nThat was a good day.\n" + +Although strings and character arrays look similar, they are still treated +differently by the compiler: + +:: + + character[*] carray = ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '\n']; + string vec = carray; + carry -> std_output; + vec -> std_output; + +prints: + +:: + + [h e l l o w o r l d + ] + hello world + + +.. _sssec:string_ops: + +Operations +~~~~~~~~~~ + +As character vectors, strings have all of the same operations defined on them as +the other array data types. +Remember that because a ``string`` and vector of ``character`` are fundamentally +the same, the concatenation operation may be used to concatenate values of the +two types. You may also append a slice of characters to a string using the +append method. +As well, a scalar character may be concatenated onto a string in the same way +as it would be concatenated onto an array of characters. +Note that because a ``string`` is a type of ``vector``, concatenation may also +be accomplished with ``concat`` and ``push`` methods: + +:: + + var string letters = ['a', 'b'] || "cd"; + letters.concat("ef"); + letters.push('g'); + letters -> std_output; + +prints the following: + +:: + + abcdefg + + +Type Casting and Type Promotion +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To see the types that ``string`` may be cast and/or promoted to, see the +sections on :ref:`sec:typeCasting` and :ref:`sec:typePromotion` respectively. diff --git a/gazprea_specification_issues.md b/gazprea_specification_issues.md index 3280179..17a9ee9 100644 --- a/gazprea_specification_issues.md +++ b/gazprea_specification_issues.md @@ -9,7 +9,7 @@ This report analyzes the Gazprea language specification from the perspective of a student attempting to implement the language for the first time. After comprehensively reviewing all 26 specification files, I identified **8 major categories of issues** that would significantly hinder implementation efforts: 1. **Inconsistent Terminology** - Same concepts described differently across files -2. **Missing Critical Definitions** - Key implementation details left undefined +2. **Missing Critical Definitions** - Key implementation details left undefined 3. **Contradictory Rules** - Conflicting statements about language behavior 4. **Unclear Precedence/Evaluation Order** - Ambiguous execution semantics 5. **Missing Edge Cases** - Insufficient coverage of boundary conditions @@ -30,19 +30,24 @@ These issues range from minor terminological inconsistencies to fundamental ambi #### Examples: **Matrix vs Multi-dimensional Array** -- `types/matrix.rst` describes matrices as "2D arrays" +- `types/matrix.rst` describes matrices as "2D arrays" - `types/array.rst` discusses "multi-dimensional arrays" - `type_promotion.rst` mentions "multi-dimensional array promotion" - **Problem**: Unclear if matrices are a special case of multi-dimensional arrays or a distinct type +- **Solution**: Matrices are N-D arrays with N=2. They are a simple extension + to the standard array terminology + **String Case Inconsistency** - `types/string.rst` uses both "String" and "string" - Keywords list includes "string" (lowercase) - **Problem**: Case sensitivity unclear - are these the same type? +- **Solution**: `string` is the correct keyword **Vector Capitalization** - Sometimes "Vector", sometimes "vector" - Method syntax suggests object-oriented features inconsistent with rest of language +- eliminate vector in favour of the alternative syntax **Student Impact**: A student would waste time trying to understand if these are different features or just documentation inconsistencies. @@ -56,11 +61,15 @@ These issues range from minor terminological inconsistencies to fundamental ambi - `declarations.rst`: "All declarations must appear at the beginning of the block" - **Missing**: What exactly constitutes "beginning"? Can there be empty statements? Comments? - **Student Impact**: Cannot write a parser without knowing exactly what's allowed +- **Solution**: "Any and all declaration statements must be the first statements + in a given block" does this apply to globals? **Memory Management Model** - `built_in_functions.rst`: `format()` returns a string - **Missing**: Who manages this memory? When is it freed? - **Student Impact**: Cannot implement memory-safe code generation +- **Solution**: Strings are freed when they go out of scope. Since strings + are just a variable length array of characters, they are treated the same **Constant Folding in Typedef** - `typedef.rst`: "Parameterized expressions (constant folding)" @@ -70,6 +79,7 @@ These issues range from minor terminological inconsistencies to fundamental ambi **Array Size Limits** - No mention of maximum array sizes or memory limits - **Student Impact**: Cannot implement bounds checking or prevent memory exhaustion +- **Solution**: Gazprea is, in essence, a 32-bit language ### 3. Contradictory Rules @@ -79,8 +89,9 @@ These issues range from minor terminological inconsistencies to fundamental ambi **Matrix Indexing Syntax** - `types/matrix.rst` examples show `M[i][j]` syntax -- Some examples use `M[i, j]` syntax +- Some examples use `M[i, j]` syntax - **Problem**: Which is correct? Are both supported? +- **Solution**: We should switch back to `M[i,j]` **Vector Methods vs Functions** - `types/vector.rst`: "Methods: `push()`, `len()`, `append()`" @@ -124,22 +135,28 @@ These issues range from minor terminological inconsistencies to fundamental ambi **Empty Array Literals** - No mention of how `[]` should be typed - **Problem**: What type does an empty array have? +- Whatever type it is declared to have. Empty arrays cannot be created literally +- Does type inference fail here? **Negative Range Bounds** - Range operator `..` defined for positive bounds - **Missing**: What does `5..1` mean? Error or empty range? +- Empty range **Integer Overflow/Underflow** - `types/integer.rst`: 32-bit signed integers - **Missing**: Behavior on overflow (wrap, error, undefined)? +- Should produce an error **NaN Propagation in Real Arithmetic** - `types/real.rst`: IEEE 754 compliance mentioned - **Missing**: Specific rules for NaN handling in operations +- Arithmetic between NaN is... UB? **Zero-Length Slices** - Array slicing syntax defined - **Missing**: What does `arr[5..4]` return? +- I'm thinking an empty array **Student Impact**: Must guess at edge case behavior, leading to unpredictable implementations. @@ -221,7 +238,7 @@ These issues range from minor terminological inconsistencies to fundamental ambi #### Strong Points: 1. **Type Safety**: Clear emphasis on type checking and safety -2. **Functional Purity**: Well-defined restrictions on functions vs procedures +2. **Functional Purity**: Well-defined restrictions on functions vs procedures 3. **Operator Precedence**: Complete precedence tables provided 4. **I/O Model**: Stream-based I/O is well-specified 5. **Array Operations**: Rich set of array operations with good examples @@ -352,7 +369,7 @@ The Gazprea language specification shows thoughtful design for a functional lang The most critical issues are: 1. **Contradictory syntax rules** that make parsing impossible -2. **Missing semantic definitions** that prevent correct code generation +2. **Missing semantic definitions** that prevent correct code generation 3. **Inconsistent terminology** that creates confusion about language features **Priority for fixes:** @@ -367,4 +384,4 @@ With these improvements, the specification would provide a solid foundation for **Generated by**: Claude Code Analysis **Date**: July 16, 2025 -**Files Analyzed**: 26 specification files in `/gazprea/spec/` directory \ No newline at end of file +**Files Analyzed**: 26 specification files in `/gazprea/spec/` directory From 9f9280a595c7529e2430b9b8c37456edd8d1dd79 Mon Sep 17 00:00:00 2001 From: Ayrton Chilibeck Date: Fri, 5 Dec 2025 15:45:18 -0700 Subject: [PATCH 2/6] impl: Constexpr definition in gazprea --- gazprea-clean/spec/constexpr.rst | 97 ++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 gazprea-clean/spec/constexpr.rst diff --git a/gazprea-clean/spec/constexpr.rst b/gazprea-clean/spec/constexpr.rst new file mode 100644 index 0000000..0a7ebff --- /dev/null +++ b/gazprea-clean/spec/constexpr.rst @@ -0,0 +1,97 @@ +.. _sec:constexpr: + +Constant Expressions +==================== + +A constant expression (sometimes called a constexpr) is an expression that can +be fully +evaluated by the compiler at compile time. This feature primarily +for specifying the size of +:ref:`statically-sized arrays `. + +In *Gazprea*, a ``constexpr`` is not a keyword, but a property of a ``const`` +variable. A ``const`` variable is considered a ``constexpr`` if and only if its +initializer expression meets a strict set of criteria: + +.. _ssec:constexpr_rules: + +Rules for Constant Expressions +------------------------------ + +An expression is a valid ``constexpr`` if it is composed exclusively of: + +1. Literals of base types (``boolean``, ``integer``, ``real``, ``character``). +2. Operators, including ``+``, ``-``, ``*``, ``/``, ``not``, ``and``, ``or``. + between two or more ``constexpr``s. +3. Constructors for aggregate types, provided they follow the rules below. +4. Index or field access on ``constexpr`` aggregate types. +5. Other variables that are themselves valid ``constexpr``s. + +An expression is **not** a ``constexpr`` if it contains: + +1. References to ``var`` variables. +2. Function or procedure calls. +3. Any I/O operations (``<-``). + +The compiler must perform this validation recursively. When checking if a variable +is a ``constexpr``, the compiler must trace its entire dependency chain. If the +chain ever depends on a runtime value, the check fails. + +**Examples:** + +:: + + // Legal Constant Expressions + const A = 10; + const B = A * 2; // Depends on another constexpr + const C = B + 5; // C is 25 + + // Illegal Constant Expressions + var x = 10; + const Y = x + 5; // Illegal: depends on a 'var' + + function get_val() returns integer { return 100; } + const Z = get_val(); // Illegal: depends on a function call + +.. _ssec:constexpr_aggregates: + +Constant Expressions with Aggregate Types +----------------------------------------- + +Arrays and tuples can also be ``constexpr``s if they meet specific criteria, +allowing them to be used to define other constants. + +#. Arrays + + A ``const`` statically-sized array is a ``constexpr`` if: + 1. Its size is a valid ``constexpr``. + 2. All of its element initializers are valid ``constexpr``s. + + Dynamically-sized arrays (e.g., ``integer[*]``) cannot be ``constexpr`` + aggregates as their size is not known at compile time. + + :: + + const WIDTH = 5; + const LOOKUP_TABLE: integer[WIDTH] = [10, 20, 30, 40, 50]; // Legal constexpr array + + const ELEMENT = LOOKUP_TABLE[3]; // Legal: ELEMENT is a constexpr with value 30 + var my_array: integer[ELEMENT]; // Legal: creates a static array of size 30 + + const BAD_TABLE: integer[2] = [10, get_val()]; // Illegal: initializer is not a constexpr + + + Note that these rules also apply to variables marked ``const`` within + non-global scopes. + +#. Tuples + + A ``const`` tuple is a ``constexpr`` if all of its fields are initialized with + valid constant expressions. + + :: + + const CONFIG = (true, 10 * 2); // Legal constexpr tuple + + const IS_ENABLED = CONFIG.1; // Legal: IS_ENABLED is a constexpr with value 'true' + const VALUE = CONFIG.2; // Legal: VALUE is a constexpr with value 20 From d810c5f1ecb102d79ee7ca92b11d4d2589843ed4 Mon Sep 17 00:00:00 2001 From: Ayrton Chilibeck Date: Fri, 5 Dec 2025 15:45:18 -0700 Subject: [PATCH 3/6] impl: array fixes for gazprea - No more vectors, instead dynamic sized arrays - Jagged arrays are in, but operations are restricted between multiple jagged arrays and jagged arrays with other types - Scalable arrays are specified with `integer[*]` syntax --- gazprea-clean/spec/types/array.rst | 253 +++++++++++++++++++++++++++++ 1 file changed, 253 insertions(+) create mode 100644 gazprea-clean/spec/types/array.rst diff --git a/gazprea-clean/spec/types/array.rst b/gazprea-clean/spec/types/array.rst new file mode 100644 index 0000000..55c765e --- /dev/null +++ b/gazprea-clean/spec/types/array.rst @@ -0,0 +1,253 @@ +.. _ssec:array: + +Arrays +------ + +Arrays are ordered, homogeneous collections of elements. *Gazprea*'s array +system offers a unified syntax for +statically-sized, dynamically-sized, and multi-dimensional arrays. + +An array's elements can be of any single type, including base types ( +``boolean``, +``integer``, ``real``), compound types (``tuple``), and other arrays. + +.. _sssec:array_decl: + +Declaration +~~~~~~~~~~~ + +An array type is specified by providing a shape in +square brackets (``[]``) to a type. + +#. Static vs. Dynamic Sizing + + *Gazprea* distinguishes between arrays whose size is fixed at compile time + (static) and arrays that can change size at runtime (dynamic). + + - A **static dimension** is declared using an integer literal or a + :ref:`constant expression `. + - A **dynamic dimension** is declared using an asterisk (``*``). + + :: + + // A statically-sized array of 10 integers. + var integer[10] a; + + // A dynamically-sized array of integers. + var integer[*] b; + +#. N-Dimensional Arrays + + Multi-dimensional arrays are declared by providing a comma-separated list of + dimension specifiers (the shape). Any dimension can be static or dynamic, + allowing for + the creation of fixed-size matrices, jagged arrays, and more general n-d + arrays. + + :: + + // A 3x4 matrix of real numbers. + var real[3, 4] matrix; + + // A jagged array: 5 rows, each a dynamic array of characters. + var character[5, *] jagged; + + // A dynamic list of static 3-element integer vectors. + var integer[*, 3] vectors; + + +#. Inferred Type and Size + + When initializing a variable with an array literal, its type and size can + be inferred by the compiler using ``var``. The resulting array is always + statically-sized unless _any_ initializer contains a dynamic dimension + or is a dynamically-sized array. + + :: + + // v is inferred as type integer[3]. + var v = [1, 2, 3]; + + // w is inferred as type real[2, 2]. + var w = [[1.0, 2.0], [3.0, 4.0]]; + + // x is inferred as type integer[*]. + var integer[*] dyn = [1, 2, 3, 4, 5]; + var x = [...dyn]; + +.. _sssec:array_constr: + +Construction +~~~~~~~~~~~~ + +An array value is constructed using a comma-separated list of expressions +within square brackets. All elements must share a common promotable type. +The element type of an unspecified array is the top-most type in the type +hierarchy that elements can be _implicitly_ promoted to. Any other unpromotable +types will result in a compile-time type error. + +:: + + [1, 2, 3] // An integer array + [1, 2.5, 3] // A real array (integer 1 is promoted) + [(1, true), (2, false)] // An array of tuples + [1, [2, 3], [4, 5, 6]] // A ragged integer array integer[3,*] + +*Gazprea* supports empty array literals (``[]``). An empty literal can only be +used to initialize a dynamically-sized array, as a static array's size must be +known. + +:: + + var a: integer[*] = []; // Legal + var b: integer[5] = []; // Illegal: size mismatch + +.. _sssec:array_spread: + +Spread Operator +~~~~~~~~~~~~~~~ + +The spread operator (``...``) provides a concise, declarative way to construct +a new array by unpacking elements from existing arrays. It can be used multiple +times within an array literal and can be combined with other elements. + +The spread operator is a syntactic feature **exclusive** to array literals. +It is +evaluated left-to-right. + +:: + + var a: integer[2] = [1, 2]; + var b: integer[3] = [3, 4, 5]; + + // c becomes [0, 1, 2, 3, 4, 5, 6] + var c: integer[7] = [0, ...a, ...b, 6]; + +When constructing a static array, the compiler must be able to verify the final +size at compile time. Spreading a dynamic array into a static array is a +compile-time size error. See :ref:`sec:constexpr` for more details. + +.. _sssec:array_ops: + +Operations +~~~~~~~~~~ + +#. Indexing and Slicing + + - **Indexing:** Elements of an N-dimensional array are accessed using a + comma-separated list of 1-based integer indices. Negative indices count + from the end of a dimension. + - **Slicing (Deep Copy):** A slice expression creates a **new, independent + array** by performing a **deep copy** of a segment of an existing array. + The resulting array has its own memory, and modifications to it will + never affect the original array. This behavior is consistent with + *Gazprea*'s rule that all assignments are deep copies. + + A slice expression is an **r-value**, meaning it produces a value and + cannot be the target of an assignment. For N-D arrays, slicing is only + permitted on the last dimension. + + :: + + var integer[5] a = [10, 20, 30, 40, 50]; + + // Legal: Create a new array 'b' from a slice of 'a'. + var integer[3] b = a[2..5]; // b is [20, 30, 40] + + // 'b' is independent of 'a'. + b[1] = 99; // 'a' remains [10, 20, 30, 40, 50] + + // Illegal: A slice is not an l-value and cannot be assigned to. + a[1..3] = [1, 2]; // COMPILE-TIME ERROR + +#. shape + + The built-in function ``shape`` returns the shape of an array as a + dynamically-sized integer array (``integer[*]``). + + For jagged arrays, ``shape`` returns the shape of the longest non-jagged + (rectangular) prefix of the array's dimensions. To get the shape of a + specific inner array, it must be indexed directly. + + :: + + var integer[10] a; + shape(a) // returns [10] + + var real[3, 4] b; + shape(b) // returns [3, 4] + + var character[5, *] c; + shape(c) // returns [5] + + var integer[2, 3, *] d; + shape(d) // returns [2, 3] + + // To get the size of an inner array of c: + shape(c[1]) // returns [N] where N is the size of the first inner array + +#. Concatenation (``||``) + + The ``||`` operator concatenates two arrays. This operation is primarily + useful for **dynamically-sized arrays**. + + :: + + var a: integer[*] = [1, 2]; + a = a || [3, 4]; // a is now [1, 2, 3, 4] + + Attempting to reassign the result of a concatenation to a static array will + result in a ``SizeError`` if the new size does not match the declared size. + The :ref:`spread operator ` is the preferred method for + composition. Note that working with a dynamically-sized array implies that + the size check must be performed at runtime. + +#. Element-wise Operations and Broadcasting + + Unary and binary operations (e.g., ``not``, ``+``, ``-``, ``*``) can be applied + element-wise to arrays. + + - For operations between two arrays, their dimensions must be compatible. + - For operations between an array and a scalar, the scalar is **broadcast** + across the array. + + *Gazprea* follows a simple "trailing dimensions" rule for broadcasting: an + array ``A`` can be broadcast over array ``B`` if ``A``'s dimensions are a suffix + of ``B``'s dimensions. + + :: + + var m: integer[3, 4] = ...; + var v: integer[4] = [1, 2, 3, 4]; + var s = 10; + + var r1 = m + s; // Legal: scalar broadcast + var r2 = m + v; // Legal: [4] is a suffix of [3, 4]. v is added to each row. + + var v2: integer[3]; + var r3 = m + v2; // Illegal: [3] is not a suffix of [3, 4]. + + The equality operators ``==`` and ``!=`` are an exception. They perform a + deep, element-wise comparison and return a single ``boolean`` value. + + These element-wise operations are fully supported for dynamic arrays where the + shape is regular (e.g., ``integer[*]``, ``integer[*, 5]``). Compatibility + checks are performed at **runtime**, and a ``SizeError`` will be thrown if + the shapes are incompatible. + + However, element-wise operations are **disallowed** on any array that has a + jagged dimension (e.g., ``integer[5, *]``). This restriction exists because + the operation is ambiguous when inner arrays have different lengths. This is + a compile-time error. To perform an operation on a jagged array, the + programmer must do so explicitly by iterating over its elements. + + :: + + // Legal operation on a dynamic array + var integer[*, 5] dyn; + var res = dyn + 5; + + // Illegal operation on a jagged array + var integer[5, *] jagged; + var err = jagged + 5; // Compile-time TypeError or ShapeError + From b1fb89314216111ed208a4f2c708b961f0790484 Mon Sep 17 00:00:00 2001 From: Ayrton Chilibeck Date: Fri, 5 Dec 2025 15:45:18 -0700 Subject: [PATCH 4/6] impl: tuple fixes for gazprea Tuples are back to being anonymous, but we have extended syntax to allow for promotion to nominal types if required. - `type T = (integer, real)` is legal and defines a type `T` that is a nominal type (so it is a true user-definied type, such that `T(1, 2.0) != (1, 2.0)`). - tuples _must_ be explicitly declared when named using the `(a: 0, b: 1)` syntax. - `typealias` syntax has been adapted to provide structural aliasing for a given type, rather than the creation of a nominal type. --- gazprea-clean/spec/types.rst | 18 +++ gazprea-clean/spec/types/tuple.rst | 181 +++++++++++++++++++++++++++++ 2 files changed, 199 insertions(+) create mode 100644 gazprea-clean/spec/types.rst create mode 100644 gazprea-clean/spec/types/tuple.rst diff --git a/gazprea-clean/spec/types.rst b/gazprea-clean/spec/types.rst new file mode 100644 index 0000000..80bd4a8 --- /dev/null +++ b/gazprea-clean/spec/types.rst @@ -0,0 +1,18 @@ +.. _sec:types: + +Types +===== + +.. toctree:: + :maxdepth: 2 + + types/boolean + types/character + types/integer + types/real + types/tuple + types/struct + types/array + types/vector + types/string + types/matrix diff --git a/gazprea-clean/spec/types/tuple.rst b/gazprea-clean/spec/types/tuple.rst new file mode 100644 index 0000000..cdd4417 --- /dev/null +++ b/gazprea-clean/spec/types/tuple.rst @@ -0,0 +1,181 @@ +.. _ssec:tuple: + +Tuples +------ + +A ``tuple`` is an ordered collection of values that groups multiple, potentially +different, types into a single compound value. + +The fields within a tuple can be anonymous or can be given explicit names. This +allows tuples to be used as simple, lightweight collections or as more descriptive, +self-documenting data structures. + +.. _sssec:tuple_structural: + +Structural Tuples +~~~~~~~~~~~~~~~~~ + +By default, all tuple literals create **structural types**. A tuple's type is +uniquely defined by the sequence of its field types and their corresponding names. +The order of fields is significant, so two tuples `(integer a, real b)` and +`(real a, integer b)` are not equivalent. + +**Type Identity** + +The names of the fields are a part of the type. Therefore, two tuples with +different field names are considered different types, even if their underlying +member types are the same. + +:: + + // These three variables all have different, incompatible tuple types. + var tuple (integer, real) a = (1, 2.0); + var tuple (integer x, real y) b = (x: 1, y: 2.0); + var tuple (integer a, real b) c = (a: 1, b: 2.0); + +**Literals** + +A tuple literal is constructed by grouping values together between parentheses +in a comma-separated list. Field names are optional and are specified with a +colon (`:`) after the name. + +:: + + // A literal of type (integer, character, boolean) + (1, 'a', true) + + // A literal of type (integer x, real y) + (x: 10, y: 3.14) + + // A literal of type (integer status, boolean) + (status: 200, false) + +Duplicate field names within a single tuple literal are not allowed and will +result in a compile-time error. + +**Access** + +Fields in a tuple are accessed using dot notation (`.`). Gazprea supports dual +access for named fields: + +1. **By Index:** All fields can be accessed by their 1-based integer index. +2. **By Name:** If a field is named, it can also be accessed by its name. + +:: + + var point = (x: 10, y: 20); + + // Access by index + point.1 -> std_output; // Prints 10 + point.2 = 30; // Modify the second field + + // Access by name + point.x -> std_output; // Prints 10 + point.y = 40; // Modify the field named 'y' + +.. _sssec:tuple_nominal: + +Nominal Tuple Types +~~~~~~~~~~~~~~~~~~~ + +For stricter type safety, a tuple structure can be used to define a new +**nominal type** using the ``type`` keyword. A nominal type is distinct from all +other types, including structural tuples that have the exact same definition. + +**Definition and Construction** + +A nominal type is defined at the global scope. Instances of the type are created +using a constructor-like syntax where the type's name is used like a function. + +:: + + // Define a new, unique 'Point' type + type Point = (integer x, integer y); + + // Construct an instance of the Point type + var my_point = Point(x: 100, y: 200); + + // This is a type error, because Point and the structural tuple are not compatible + // var another: Point = (x: 1, y: 2); // ILLEGAL + +**Access** + +Access for nominal types works identically to structural tuples, allowing access +by index or by name. + +:: + + my_point.x = 150; + my_point.2 -> std_output; // Prints 200 + +.. _sssec:tuple_ops: + +Operations +~~~~~~~~~~ + +**Comparison** + +The equality (`==`) and inequality (`!=`) operators are defined for tuples. +Two tuples are considered equal if and only if: +1. They have a compatible type. For structural tuples, this means their type + signatures (field types, names, and order) are identical. For nominal + types, both must be of the same nominal type. +2. All corresponding fields are pairwise equal. + +:: + + var p1 = (x: 1, y: 2); + var p2 = (x: 1, y: 2); + var p3 = (a: 1, b: 2); + + p1 == p2; // true + p1 == p3; // false (incompatible types) + + type Point = (integer x, integer y); + var n1 = Point(x: 1, y: 2); + var n2 = Point(x: 1, y: 2); + + n1 == n2; // true + n1 == p1; // false (incompatible types: nominal vs. structural) + +.. _sssec:tuple_casting: + +Type Casting and Promotion +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**No Implicit Promotion** + +Gazprea does not support implicit promotion or conversion between different +tuple types. If two tuple types are not identical, they are incompatible. + +:: + + var unnamed: (integer, integer) = (1, 2); + var named: (integer x, integer y); + + named = unnamed; // ILLEGAL: types are not identical. + +**Explicit Casting with `as<>`** + +The `as<>` operator must be used to explicitly convert between compatible tuple +types. This is the only mechanism to: +1. Convert between different structural tuple types. +2. Convert a nominal tuple to its underlying structural type (or vice-versa). + +The cast is only valid if the fields of the source tuple can be pairwise cast +to the fields of the destination type. + +:: + + // 1. Cast a structural literal to a named structural type + var named: (integer x, integer y) = as<(integer x, integer y)>((1, 2)); + + // 2. Cast between compatible nominal and structural types + type Point = (integer x, integer y); + var my_point = Point(x: 10, y: 20); + + // Cast from nominal to structural to call a generic procedure + var structural_point = as<(integer x, integer y)>(my_point); + + // 3. Cast from a structural literal to a nominal type + var another_point = as((x: 1, y: 2)); \ No newline at end of file From 15abcab7dcd8a8b69dd7ddc398f39ba4a1a48569 Mon Sep 17 00:00:00 2001 From: Ayrton Chilibeck Date: Fri, 5 Dec 2025 15:45:18 -0700 Subject: [PATCH 5/6] ext: added borrow-checker extension document TBH, mostly chatgpt generated. --- .../spec/extensions/borrow-checker.rst | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 gazprea-clean/spec/extensions/borrow-checker.rst diff --git a/gazprea-clean/spec/extensions/borrow-checker.rst b/gazprea-clean/spec/extensions/borrow-checker.rst new file mode 100644 index 0000000..7cc1013 --- /dev/null +++ b/gazprea-clean/spec/extensions/borrow-checker.rst @@ -0,0 +1,82 @@ +.. _ssec:ext_borrow_checking: + +Ownership and Borrowing System +============================== + +One of the most powerful but complex extensions would be to replace *Gazprea*'s +default "deep copy" memory model with an ownership and borrowing system, similar +to the one pioneered by the Rust programming language. + +**High-Level Goal** +------------------- + +The goal of this system is to guarantee memory safety (no dangling pointers, no +data races) at compile time **without** requiring a garbage collector. This would +allow for highly performant code with C-like speed while providing strong safety +guarantees. It would enable powerful features like zero-cost mutable "views" +into arrays, solving the problem discussed in the main specification. + +A new keyword, such as ``ref``, could be introduced to create borrowed +references to data. + +:: + + // Hypothetical Gazprea with borrowing + procedure sort_portion(ref arr: integer[*]) { + // ... sort the slice in-place ... + } + + var my_data: integer[100] = ...; + call sort_portion(ref my_data[10..20]); // Pass a mutable view + +Major Architectural Changes Required +------------------------------------ + +Implementing a borrow checker is not a small feature; it is a fundamental change +to the entire compiler architecture. It would require: + +1. **A Lifetime-Aware Type System:** The type checker would need to be + fundamentally altered to understand lifetimes. A type like ``ref integer`` + is incomplete; the full type is ``ref<'a> integer``, where ``'a`` is a + lifetime parameter that the compiler must track and validate. This involves + complex inference and subtyping rules. + +2. **Control-Flow-Sensitive Static Analysis:** The compiler would need a new, + major analysis pass that runs after initial type checking. This pass must: + a. Build a Control-Flow Graph (CFG) for every function. + b. Track the state of every variable (owned, immutably borrowed, mutably + borrowed, or moved) along every possible execution path. + c. This analysis, often called "borrow checking," is a non-trivial data-flow + analysis problem. + +3. **Sophisticated Error Reporting:** The compiler must be able to generate + human-understandable error messages for complex borrow-checking failures, + such as "cannot borrow `x` as mutable because it is also borrowed as + immutable in function `f`." + +Documentation and Further Reading +--------------------------------- + +**Community and Engineering Focused:** + +* **The Rust Programming Language (Book):** The official book provides the most + accessible introduction to the concepts of ownership, borrowing, and + lifetimes. Chapters 4, 10, and 15 are particularly relevant. + * *Link:* `https://doc.rust-lang.org/book/ch04-00-understanding-ownership.html `_ +* **Rustonomicon:** For a deep dive into the memory model and the unsafe code + that a borrow checker allows you to avoid. + * *Link:* `https://doc.rust-lang.org/nomicon/ `_ +* **Niko Matsakis's Blog:** A series of blog posts from a lead Rust developer + detailing the implementation and evolution of the borrow checker. Essential + for understanding the practical engineering challenges. + * *Link:* `https://smallcultfollowing.com/babysteps/ `_ + +**Academic and Theory Focused:** + +* **"Region-based memory management"** and **"Affine types"** are the core + computer science concepts behind borrow checking. Academic papers on these + topics provide the theoretical foundation. +* **RustBelt: Securing the Foundations of the Rust Programming Language (PLDI 2018):** + A key academic paper that formally models and proves the safety of Rust's + type system. + * *Link:* `https://dl.acm.org/doi/10.1145/3296979.3192384 `_ From e9b4a78eab764b2a3e3008eb3e3ea70fd2142ca2 Mon Sep 17 00:00:00 2001 From: Ayrton Chilibeck Date: Fri, 5 Dec 2025 15:45:18 -0700 Subject: [PATCH 6/6] wip: gazprea facelift Based on feedback from last year, I propose the following changes: - A definition for constexpr - A revised version of vectors (now contained in arrays) - Ragged arrays as data structures only - Arrays as the root of all composites in gazprea (different classes, e.g. dynamic, static, ragged, all handled in the backend) - Well defined arrays of structs - A revised definition of tuples - Tuples and instantiation - Nested tuples - A set of extensions for students to further experiment with Keeping this in a seperate folder from the current specification for the moment, but would like comments on how we might like this system to evolve. There are rough edges that I would like to smooth out in tuples and arrays, and a solution compiler is underway (privately) --- gazprea-clean/spec/constexpr.rst | 8 ++++++-- gazprea-clean/spec/declarations.rst | 3 +-- .../extensions/exposing-memory-primitives.rst | 0 gazprea-clean/spec/extensions/extern.rst | 0 .../spec/extensions/multi-file-projects.rst | 0 gazprea-clean/spec/extensions/type-methods.rst | 0 gazprea-clean/spec/functions.rst | 12 +++++------- gazprea-clean/spec/keywords.rst | 12 +----------- gazprea-clean/spec/types/array.rst | 18 +++++++++--------- gazprea-clean/spec/types/string.rst | 11 ++++------- 10 files changed, 26 insertions(+), 38 deletions(-) create mode 100644 gazprea-clean/spec/extensions/exposing-memory-primitives.rst create mode 100644 gazprea-clean/spec/extensions/extern.rst create mode 100644 gazprea-clean/spec/extensions/multi-file-projects.rst create mode 100644 gazprea-clean/spec/extensions/type-methods.rst diff --git a/gazprea-clean/spec/constexpr.rst b/gazprea-clean/spec/constexpr.rst index 0a7ebff..07da53c 100644 --- a/gazprea-clean/spec/constexpr.rst +++ b/gazprea-clean/spec/constexpr.rst @@ -23,7 +23,8 @@ An expression is a valid ``constexpr`` if it is composed exclusively of: 1. Literals of base types (``boolean``, ``integer``, ``real``, ``character``). 2. Operators, including ``+``, ``-``, ``*``, ``/``, ``not``, ``and``, ``or``. between two or more ``constexpr``s. -3. Constructors for aggregate types, provided they follow the rules below. +3. Constructors for aggregate types, provided that the aggregate is const and + all members are ``constexpr``s. 4. Index or field access on ``constexpr`` aggregate types. 5. Other variables that are themselves valid ``constexpr``s. @@ -68,7 +69,8 @@ allowing them to be used to define other constants. 2. All of its element initializers are valid ``constexpr``s. Dynamically-sized arrays (e.g., ``integer[*]``) cannot be ``constexpr`` - aggregates as their size is not known at compile time. + aggregates as their size is not known at compile time even if it can be + inferred. :: @@ -84,6 +86,8 @@ allowing them to be used to define other constants. Note that these rules also apply to variables marked ``const`` within non-global scopes. + + #. Tuples A ``const`` tuple is a ``constexpr`` if all of its fields are initialized with diff --git a/gazprea-clean/spec/declarations.rst b/gazprea-clean/spec/declarations.rst index a87865d..d1c4e06 100644 --- a/gazprea-clean/spec/declarations.rst +++ b/gazprea-clean/spec/declarations.rst @@ -4,7 +4,7 @@ Declarations ============ Variables must be declared before they are used. Aside from -a few :ref:`special cases `, declarations have the +a few :ref:`special cases `, declarations have the following formats: :: @@ -85,7 +85,6 @@ Special cases Special cases of declarations are covered in their respective sections. #. :ref:`Arrays ` -#. :ref:`Matrices ` #. :ref:`Tuples ` #. :ref:`Globals ` #. :ref:`Functions ` diff --git a/gazprea-clean/spec/extensions/exposing-memory-primitives.rst b/gazprea-clean/spec/extensions/exposing-memory-primitives.rst new file mode 100644 index 0000000..e69de29 diff --git a/gazprea-clean/spec/extensions/extern.rst b/gazprea-clean/spec/extensions/extern.rst new file mode 100644 index 0000000..e69de29 diff --git a/gazprea-clean/spec/extensions/multi-file-projects.rst b/gazprea-clean/spec/extensions/multi-file-projects.rst new file mode 100644 index 0000000..e69de29 diff --git a/gazprea-clean/spec/extensions/type-methods.rst b/gazprea-clean/spec/extensions/type-methods.rst new file mode 100644 index 0000000..e69de29 diff --git a/gazprea-clean/spec/functions.rst b/gazprea-clean/spec/functions.rst index 0d1bbdb..238e559 100644 --- a/gazprea-clean/spec/functions.rst +++ b/gazprea-clean/spec/functions.rst @@ -5,11 +5,12 @@ Functions A function in *Gazprea* has several requirements: -1. All of the arguments are implicitly ``const``, and can not be mutable. +1. All of the arguments are implicitly ``const``, and can not be mutable or + mutated within the function. 2. Function arguments cannot contain type qualifiers. Including a type qualifier with a function argument should result in a ``SyntaxError``. -3. Argument types must be explicit. Inferred size arrays are allowed +3. Argument types must be explicit. Dynamic sized arrays are allowed 4. Functions can not perform any I/O. @@ -180,7 +181,7 @@ The arguments and return value of functions can have both explicit and inferred } -Like Rust, array *slices* may be passed as arguments: +Like Rust, array *slices* :ref:`_sssec:array_ops` may be passed as arguments: :: @@ -198,7 +199,7 @@ Like Rust, array *slices* may be passed as arguments: Remember that all function parameters are ``const`` in *Gazprea*, so that all functions are pure. That means that while it is legal to pass arrays and slices -*be reference*, the array contents cannot be modified inside the function, +*by reference*, the array contents cannot be modified inside the function, because the change would be visible outside the function. You must check that the ``const`` requirement is honored. @@ -213,8 +214,5 @@ gazprea program, nor can you forward declare the same function twice. Additionally, functions share the following namespaces: -- The ``struct`` namespace: you cannot have a struct and function with the same - name in the same gazprea program. - - The ``procedure`` namespace: You cannot have a procedure and function with the same name in the same gazprea program. diff --git a/gazprea-clean/spec/keywords.rst b/gazprea-clean/spec/keywords.rst index 4c83471..16588f0 100644 --- a/gazprea-clean/spec/keywords.rst +++ b/gazprea-clean/spec/keywords.rst @@ -20,8 +20,6 @@ not be used by a programmer. - character -- columns - - const - continue @@ -40,7 +38,7 @@ not be used by a programmer. - integer -- length +- shape - loop @@ -56,10 +54,6 @@ not be used by a programmer. - returns -- reverse - -- rows - - std_input - std_output @@ -68,8 +62,6 @@ not be used by a programmer. - string -- struct - - true - tuple @@ -78,8 +70,6 @@ not be used by a programmer. - var -- vector - - while - xor diff --git a/gazprea-clean/spec/types/array.rst b/gazprea-clean/spec/types/array.rst index 55c765e..0816bc2 100644 --- a/gazprea-clean/spec/types/array.rst +++ b/gazprea-clean/spec/types/array.rst @@ -99,8 +99,8 @@ known. :: - var a: integer[*] = []; // Legal - var b: integer[5] = []; // Illegal: size mismatch + var integer[*] a: = []; // Legal + var integer[5] b: = []; // Illegal: size mismatch .. _sssec:array_spread: @@ -117,11 +117,11 @@ evaluated left-to-right. :: - var a: integer[2] = [1, 2]; - var b: integer[3] = [3, 4, 5]; + var integer[2] a = [1, 2]; + var integer[3] b = [3, 4, 5]; // c becomes [0, 1, 2, 3, 4, 5, 6] - var c: integer[7] = [0, ...a, ...b, 6]; + var integer[7] c = [0, ...a, ...b, 6]; When constructing a static array, the compiler must be able to verify the final size at compile time. Spreading a dynamic array into a static array is a @@ -193,7 +193,7 @@ Operations :: - var a: integer[*] = [1, 2]; + var integer[*] a = [1, 2]; a = a || [3, 4]; // a is now [1, 2, 3, 4] Attempting to reassign the result of a concatenation to a static array will @@ -217,14 +217,14 @@ Operations :: - var m: integer[3, 4] = ...; - var v: integer[4] = [1, 2, 3, 4]; + var integer[3, 4] m = ...; + var integer[4] n = [1, 2, 3, 4]; var s = 10; var r1 = m + s; // Legal: scalar broadcast var r2 = m + v; // Legal: [4] is a suffix of [3, 4]. v is added to each row. - var v2: integer[3]; + var integer[3] v2; var r3 = m + v2; // Illegal: [3] is not a suffix of [3, 4]. The equality operators ``==`` and ``!=`` are an exception. They perform a diff --git a/gazprea-clean/spec/types/string.rst b/gazprea-clean/spec/types/string.rst index e3d76a4..a89185c 100644 --- a/gazprea-clean/spec/types/string.rst +++ b/gazprea-clean/spec/types/string.rst @@ -4,12 +4,8 @@ String ------ A ``string`` is another object within *Gazprea*. Fundamentally, a ``string`` is -a ``vector`` of ``character``. -This means that, like a vector, a string behaves like a dynamically sized array, -but because it is an object *Gazprea* can provide type specific features. - -String vectors behave a lot like character arrays, but there are several -differences between the two types: +a dynamic-sized ``array`` of ``character``. There are several +additional behaviours that are unique to strings: an :ref:`extra literal style `, the :ref:`result of a concatenation ` and :ref:`behaviour when sent to an output stream `. @@ -20,7 +16,8 @@ Declaration ~~~~~~~~~~~ A string may be declared with the keyword ``string``. The same rules of -:ref:`vector declarations ` also apply to strings, which means +:ref:`dynamic array declarations ` also apply to strings, +which means that all lenghts are inferred: ::