From be066afe236968c5e6e0d57055d29361a0b5e738 Mon Sep 17 00:00:00 2001 From: Soispha Date: Mon, 18 Dec 2023 20:50:58 +0100 Subject: [PATCH] feat(trixy-lang_parser): Add support for structs and enums --- trixy/trixy-lang_parser/docs/grammar.ebnf | 10 ++- trixy/trixy-lang_parser/docs/grammar.pdf | Bin 32641 -> 45979 bytes trixy/trixy-lang_parser/example/multiple.tri | 2 +- trixy/trixy-lang_parser/example/types.tri | 18 ++++ .../src/command_spec/unchecked.rs | 37 +++++++- trixy/trixy-lang_parser/src/lexing/mod.rs | 10 +++ .../trixy-lang_parser/src/lexing/tokenizer.rs | 4 +- .../src/parsing/unchecked.rs | 81 ++++++++++++++++-- 8 files changed, 142 insertions(+), 20 deletions(-) create mode 100644 trixy/trixy-lang_parser/example/types.tri diff --git a/trixy/trixy-lang_parser/docs/grammar.ebnf b/trixy/trixy-lang_parser/docs/grammar.ebnf index 749149c..05ffca8 100644 --- a/trixy/trixy-lang_parser/docs/grammar.ebnf +++ b/trixy/trixy-lang_parser/docs/grammar.ebnf @@ -6,11 +6,13 @@ # - Block comments (`/* */`). # *) -CommandSpec = { Function | Namespace } ; -Function = "fn" Identifier "(" {Identifier ":" Type} ")" [ "->" Type ] ";" ; -Namespace = "nasp" Identifier "{" {Function | Namespace} "}" ; -Type = "String" | "Integer" ; # (* This corresponds to the CommandTransferValue *) +CommandSpec = { Function | Namespace | Enumeration | Structure } ; +Function = "fn" Identifier "(" [NamedType {"," NamedType }] ")" [ "->" Type ] ";" ; +Namespace = "nasp" Identifier "{" {Function | Namespace | Enumeration | Structure} "}" ; +Structure = "struct" Identifier "{" [NamedType {"," NamedType } [","]] "}" ";"; +Enumeration = "enum" Identifier "{" [Identifier {"," Identifier} [","]] "}" ";"; Identifier = CHARACTER { NUMBER | CHARACTER } ; +NamedType = Identifier ":" Type; # (* # vim: ft=ebnf diff --git a/trixy/trixy-lang_parser/docs/grammar.pdf b/trixy/trixy-lang_parser/docs/grammar.pdf index 54cad09d87574d9864c5cf9ccd9bc1e95ac12834..bf84bb08e785d71833d7fc4ccb2b30ba7b287bfd 100644 GIT binary patch delta 40204 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

CE$U5DJ&Ylob6*t=q844tL*LSVT&5lSCD{6 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%0DW1&q?akb3X8p!ABD zq(5v09l8gQu}1k?v^TFMBGJ0S=Q;laU;N8oP^Ok0_Z?(8=pA5S|$t@#2SFbJz|YSsz41jExl#!%uwt)ze$a@bp@|lhA|md=5rY zpENg%orPX1`pBKB%JA#)7^;(94z@6swPh2Hn)^a8A?lj$MCW9#@t}{iv{8(!)UYHQ zG@>%~GHt*6wL;ceXgNXA`N7bRLi~Qw0fA)K=GYgPsQRThz~g4Ybxb@)CUg3VBe@O= z^5{iBSqpL*c_uUfLoz8rYktaD3oQgy`n?RJ$BEx}T(K=p%q@|@#&5YX^_!j`RErYI zrMZ_@;KW&4ErD^}XApnY4X0*90|J=i8 zlICJTlU1GM>xG#X4wP%p-Ye$s(4Q&Oh{9AU?aBk<2PX8)*EI7}GPZrDBzJhR`pQ)f ze;o;P5XiVwrj528G~xQ&-8WD>oXe_c8Fl>gRos4A0p)giyu5~v$1QobbnL`w4aud2 zQ=*yQk&-?LObsrw0V9_h{TvwU>*hv+>St6HOsG#ks3Mgx{!DqTDZ5j7;#}-nYnJMG z?;%D45zIFz{Jr~htKJP$jBgr|i{1^|`yzq=B`WF_tETv@h8`*(AZ;i-?L`*cx>YY- z(C?*>0$IzG(L$uv62v&x($lFqg)8R41USr&3lmv_(Lv{+7x1OS`E!@!-QtyIEA7xkakP?tK6`f+=bp4uEZ+$*hLvV(yLPn} zhD^wt6{+pel=gW_c|oR@tB~R7G;iZXF|LdF1Gs0b3%D+?HIyzFm_ABLW%Aku-do1$ z>PW*45AqNMy8ki0B2^UH{DW}&R}j(5mo7#l=ZGR{rmk_9 z@~@%%YKeu#{JWI(Yo`;tS?GpOy6)#Xo*`{*gp8_nbmR>t;z=OiEKPkaf;x)qe5l|}hkr4G3?Lltm?&!0eVxbVvGxpU+aDtK12@SV9U;N=R zP#F4BWRNfW(Cwna`u4Z(Mdefe#)}PAYJRr#2KU{l>RBQF=Om8b+{AH{;mXRwX5x`P z4KubE)1O-blD|s=3PG#tS{({5*I!N3r@OM7N5z~AuoawyLyXqN5)0k~-%j4ihDQz9j~a(luRGhE#SSznL$Y8Z=ayJ3CjGn`*C_ z;LBL|Hm<v0vY)?fU)Z8?|Cwm5|084UPwL_Er(eB~Q(C29IuLVUOh-I0N|WGY+{N zi;!#qu!?_+i;;@mMvz!MH4N5wSmlROrGN0r+c_)$aKc;hk#>6WLjr-_36~F;{V?Fl z3uFx6UH~CnSe#!rs<{LTlU`-3w2M`OY{M{;)Q;<_J?I`Z4PTL@*Jc<|iCDePir00I1QBn2LoI=%|G<6E0#jAL#$g@hFwJxf6Dez>9p+hboz6D&R)!7VZBt7GH}09RrxOI#DjUD zqosbk0ymi5ep?fk8n2Sv!v2%0y1ulOFjeCl^>q&Fkcd_zLahs5Kso%T3V(U_LGoiqrNwgW@0d z@kHG2mbS6jZE6C2sP;dg$_ZYckEAx2+3VRq*}ve|i9O)+nclh_o)YX#&NhBd_R$(r zoeE@d68Cb202tZBzGY7P#DP1eKI;Pofm+I?=4@=c(^C(v!3=bu@(v)lG z)BPIwooNEL{?o(1O`Bw6{rzW(Ahi~Y(0)y6xbdcmsHw#TgehCbJiZ-p&N8FAU?Xet zRbQ)?Y+lSx#u@pCKgdh=6CWEdb<8kv@K0)uWvHv@KkP;B`F4`#IMMigLD+t8tB!bl z0`^A>X21$Iod^wL><(SrFAjv~8x8I@5pL|p#Y;th--`4^783f=5gAPPzbBm)Lk@Yf z3@0Tp507j~i6c0{^0*uNw4`yTR+~|XY-e8o8dh(+ZJ#1JoGt7`s#^)?;C8XiL%>^~fu?kn_Po)BAM(Bj=OPse#TfD-m zFpX>No=T@GH(5*$ITy-yPNWh;x{FExMRGd|0N|F6Tm)9D^Slj+hN{13*F2+Yva$IV zB_MF2#TeK2C{^de@6G&cY;~)xN|03^sS0Bjd&^+b*_PGnOQjiv>rSnct^Xx_KA+{a42ojG2+qo2t>~z>UNK zOhWILMTIh?o*Q{mrAe0y(&QbHWbeD+Fc+EfVhOVos{DhyH66K{tB_*Fgv$rq z+w@EgoCty%P7)g*Q|@Mw!3e8jH~?qWfZYa< zQljV4TvVl%)QDJaG^J>)#3pz2*D%%yaE(7UOLzX5s=iSbYyNcaxY*^Vh^Zsr$zCj$ zPqxXj(`7pWQt=iZsfnTA^&nI1Z2R3GZ#tQ_G(jqvhj8ABz_-J2%a~d@9fLRAP!G9m zU2U#SG>$H;O(9jOQCi2QS^Nnay1lF8jwNQg) z_3G_=UtyzGB*#r|#V%HwdsNcxQuFPHR?zeeP7#Ou>fE~7!cZMwgTd`{ppVe??lZS$@@iINJRk|e+kcOM6<>;H5GC`qttDqib%zwcu_r+FQCC) zW~`_TTO0zoq>JT)RO2uLVAkJ`Uhf1Pa#YukBl3M~jjG{{{-@&1ZB5WO-}}UPh(pJZ zwm{AIA^6zDd_^IK3A1)cfG*g7nkqNyqDT1W+G2%3-P34OgKaVhb^*8cRZCVwFZjM6 zf3d1S0W(sc^e&NMoFp8d`u;+V7sVd=Cu~MY;@)o3g#XF+KaOp=LyRRi6MwWbNmxKo zk0&&^_E1-ZM~{tYdu5~x70@zxSgH)}BbOESmbqSeiy;5u>5+wNK$9ll|Bg-|B`n4? z4!UN+kKeZ_WS5#WP<*C&)PIZ4!J{e`IK!{D1;b8!#QGM;C&6%yS)y>N39^p`l=sEq zTkh(1Aaz#yICG)I{jhAt+l(WagG5XdibLC3@*BHKQ8WQ))jqrZ14%{sascmf5WTC| zz+7$0T*VNx68jS{Xqbu-pj<%X$(WvT#e-Q-v*)+|E_cr<^g|8n-OyNz^sm<|S;+vq z+rzN$#h?;ilG>qd>LgjJ@vRI`60>^b5WXd`%ZgxhBUwv0p0~yiRYf4QD!{^b}0Q9OxDeCvU$f zNvl~!cz0PUZ5CvXbO}ldTBb(TYkBXep)pzUv70@k9Gz81RjN+7K}zlZjr+J9X!!4i zN4BMAiGm$i82F|p@1{2jjHpqWL3tQ%ED@g9jzSi{(CYM2Lot_>4l-OnoXttfEL4mr{* z7BCxs>}+`XEl5XmKNJg;zOD~OKG9Rsq7W2ES0w-?cqK^T;037CJUOwcoQ!YnEb6Y; zIA|g(<#pPWn`%>PWm9yfFG>gwXI7)U5}#B%k}eMgvc5Vlk}OU?lUW?kgQ#)hXupkG(#XN#f{ZN64lbRXAxw_mqA3C%HRqkva z!BE|TW)kDD51Jv1W$?>84A$o$RoPho@V=7nPV^%T=YjG#<6rj&0xc5Lk{oFloJv8} zNUb3z<%wAh|1sIKPHgKHV|wjLw(@x#-Iy=AzI^{95(?rQ8oVSpzPLIojR~ENLitl_~DP3@?wi58j>h8|^>XzLR~BUCAZJ(B@X>SI8&jQgMh+gUWX1 z>E+2HzZ`0+nqRu0XFn-2lZL~xyjyvwOb4Fef}0v2LXh5e+$YYYzD!11cT<6S)`pHJS^;+DM~VS~7=WIv?vE=4y(JeR(C8GfYdFQ*Jv^Q|3iV5g>nY zjWpw$+p|;H+}5qY3~s-L9}kJLve!p4%^ z?PTbgJZ$zV*`)EVEDc~ZxPUb+!eq%?JDTfpd!{Mds^+rc0=qmotRds+VTXe4_udWG z|7drfZWO1t0OvN!yq?$5B5W7EdK1T{}^hpDo~hx&A%5l%iSuH zB6d>bjh$u_C~?p`Ed>|LLSR~T4_=ZDI$EU`e2QD+2te)$69UZ4NlS%gzsgXuon>SF zz_|bH7V}a6om5oqdrQQ0DraV=5-0KcU;I+b77JQ70uDm4DN={_D5QlC=&%Pq4Sg>WmdgJQP&6Ce>m^cy%twIyUL~D7|H2JwwtJAqs z%nPEBE-?9i5nG4=;{uR!C)$7NBCLSbb}#8$TOBAvUM+c1D8Crnx+H$hcIqEXE6J$7 zJsZ4!4}<4)aQ0a|cJ)pb;dz&QY8)_l0Nq&ER;|+8Uzi_80BN~wE|40SK5j!!sRi5D zD2m3+o(nOfY16bxl$?&T;6SX`k@*p0e0~_raKUEGvKS)P0RN5t#6#tw7qLcdvkz!KL)Mn>Us4?{qPSpY3mx zZ8c**qVeKtz!M>(Cs4w ze-BauHyw`3)aw{SLL|19|7;=^=!evXX#p*J>9;v^y;xl|H~|eEZ_|}D+zqt^6lqGVywsH9p7}M5&SiJAhpIigx)# zM|ew1z#_f07&UY*$F};FL8z|#<0r>mj(N3?QRIYdwPHs&4S&ViH!=|RqkI1MxyMCH zUBPuydTOGjekmelnOj@h#+pU(tH{FVfKA-|cEoB{EI5Zyhe#St;WPDs2u+11md`mr zeJ$5@q=7($P2O61bvhb1)DEko55DHI*Uzao^Y5noerCFbT&Daj5zK2xD4b#=^CbdZ z6~?2dyTAac>kC7P7+#*Pk*s^d`T@+2Y0IXJh?bZ8IHP*ncvpI15x>2`Z&kW1N3S}T zO}KSy+>L@a`$X+PHKDw3Lvk%kjDKGCcZats5OJRJ9X)LYrSnawQGJN*SU5!4|q2sp!j?$pUUb6#0CHjz7 z@C3$H{M)feO*#7Kr;t!>>9pH`2F??%XaEN}9@(>M_m+H$;Po@xfz9|G%)@^d*adc3 z#5@5a;_xhNVi8cK@Y2z%OdmK)$4}S+76@}1(dn_g++x`NmP&G^=SQ~sMt9?QcrNIX zkaxgB< z`q)GCbtD1^vSp+w#@qUYAA}k7(0K3zx_4>gqO(-%-Dqx(ceO$vne&*oAmq% zB{D+Eo|GX@(>PEP3I)l<)u>Pb2?4>Dq+Cfz$ia`uDr4*F=1#`J@qhPlyuAOr2xL9o zKxOqS`uELu#)E1ysfUwQjEXNT+ph3RNy!gHTfh0Tw!j0iAlbstkMSCFGdPgG)T=6g z{7m zdDfx?fK(0XuY0f5c*CzZ1_22ZUfxV}ONeb5%oU_}*w;$|sz&?*q?3Wyn ze+LzNN}IG8hNp%w>FG+U^2`xppJGKvpd0RaMdsus66)g`ce}9cHcQlGCPd2=;X` z6dmO-?3m$j{h6}~{52~I!45#BOzB7Erx13PmZ2ge&p?-^Xdq*kA4#;JqODvvo9MEs znMUISXo$PCh)%S+VPYz$`fI_b+FX1Nl9ICw1diA!1@B~m$Bbz_JG1i+vX1wuM_lr* z(R23Ul>-&Y^$<~xrdrXu=34mIeznX+KHGmc;a%r2bi{{%^Or){2GHKpHg{|nY^?Al zE!#zc8;8t~ev8}zSPN{G;IkmbKZ+q>b*hdn-*U-yL#5loWIGos>I{9U!MOyJ{p*b6Z@;jxPy&}POo4AHG+n5GV z=1~D`okDY5e*f0!|beU@g6_!myYsdB7Q zXmiaE-B!y6`W4qtTDJ2<$>>(vJ!F@2^EG0MCS&9pjehH|Hv--ldH62(<(6Y)noiqA zUY-HMFQqA1zgPHN?8(zsv6a6erq(V4Za6R55r;lN8NyALViUuZ!RH5}S!VLn!I?W_ zMVE?aMgI!+LCGWi%Fjr>63v0CD}-zgOC@7DeHcLJ$I>Z${bq2y$X3hr+1rsBP}YApXGH&{Kjl-lNz}ER}B$`qlM6VI1Y7r zMP&K~-~OV+|8_xJs3vh^li!HBdy92@l=QtMHO~I6|nXP%B(7V;A#mIrNp1s(2ZTeIb0bCb@?%XY`% z(BrreW6`g&!pTZQ*^be?uRVQbHB}hcf$TR3xb=a?Jj&ez=^rZ2I;?vyFT@5V#tqeX zf*etA#7fQ@LruRP+`r^2CuL{}sr%$Th(2Ccn~;e!}IiU4`b-t#{WbQ#eWR diff --git a/trixy/trixy-lang_parser/example/multiple.tri b/trixy/trixy-lang_parser/example/multiple.tri index a0d01ad..0fca007 100644 --- a/trixy/trixy-lang_parser/example/multiple.tri +++ b/trixy/trixy-lang_parser/example/multiple.tri @@ -5,7 +5,7 @@ nasp trinitrix { } nasp trinitrix { - fn ho(name: String) -> String; + fn ho(name: String, name2: String) -> String; } diff --git a/trixy/trixy-lang_parser/example/types.tri b/trixy/trixy-lang_parser/example/types.tri new file mode 100644 index 0000000..b599445 --- /dev/null +++ b/trixy/trixy-lang_parser/example/types.tri @@ -0,0 +1,18 @@ +nasp trinitrix { + struct Callback { + func: Function, + timeout: Integer, + }; + + enum CallbackPriority { + High, + Medium, + Low, + }; + + fn execute_callback(callback: Callback, priority: CallbackPriority); +} + + +// That's a flat out lie, but it results in a rather nice syntax highlight compared to nothing: +// vim: syntax=rust diff --git a/trixy/trixy-lang_parser/src/command_spec/unchecked.rs b/trixy/trixy-lang_parser/src/command_spec/unchecked.rs index ec2fa66..c7d2dc5 100644 --- a/trixy/trixy-lang_parser/src/command_spec/unchecked.rs +++ b/trixy/trixy-lang_parser/src/command_spec/unchecked.rs @@ -17,7 +17,22 @@ pub struct Declaration { impl Declaration { pub fn new_function(function: Function, namespace: Vec) -> Self { - Declaration { namespace, genus: Genus::Function(function) } + Declaration { + namespace, + genus: Genus::Function(function), + } + } + pub fn new_structure(structure: Structure, namespace: Vec) -> Self { + Declaration { + namespace, + genus: Genus::Structure(structure), + } + } + pub fn new_enumeration(r#enum: Enumeration, namespace: Vec) -> Self { + Declaration { + namespace, + genus: Genus::Enumeration(r#enum), + } } } @@ -32,17 +47,31 @@ pub enum Genus { Dummy, /// A function Function(Function), + Structure(Structure), + Enumeration(Enumeration), } #[derive(Debug, PartialEq, Eq, PartialOrd, Ord)] pub struct Function { pub identifier: Token, // Will later become an Identifier - pub inputs: Vec, + pub inputs: Vec, pub output: Option, // Will later become an Type } #[derive(Debug, PartialEq, Eq, PartialOrd, Ord)] -pub struct FunctionInput { - pub name: Token, // Will later become an Identifier +pub struct Structure { + pub identifier: Token, // Will later become an Identifier + pub contents: Vec, +} + +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)] +pub struct Enumeration { + pub identifier: Token, // Will later become an Identifier + pub states: Vec, // Will later become an Identifier +} + +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)] +pub struct NamedType { + pub name: Token, // Will later become an Identifier pub r#type: Token, // Will later become an Type } diff --git a/trixy/trixy-lang_parser/src/lexing/mod.rs b/trixy/trixy-lang_parser/src/lexing/mod.rs index 989ec8b..a8ecd6c 100644 --- a/trixy/trixy-lang_parser/src/lexing/mod.rs +++ b/trixy/trixy-lang_parser/src/lexing/mod.rs @@ -169,6 +169,12 @@ pub enum Keyword { /// Start a function declaration #[allow(non_camel_case_types)] r#fn, + /// Start a structure declaration + #[allow(non_camel_case_types)] + r#struct, + /// Start a enum declaration + #[allow(non_camel_case_types)] + r#enum, } impl Display for Keyword { @@ -176,6 +182,8 @@ impl Display for Keyword { match self { Keyword::nasp => f.write_str("nasp"), Keyword::r#fn => f.write_str("fn"), + Keyword::r#struct => f.write_str("struct"), + Keyword::r#enum => f.write_str("enum"), } } } @@ -214,6 +222,8 @@ macro_rules! token { [nasp] => { $crate::lexing::TokenKind::Keyword($crate::lexing::Keyword::nasp) }; [fn] => { $crate::lexing::TokenKind::Keyword($crate::lexing::Keyword::r#fn) }; + [struct] => { $crate::lexing::TokenKind::Keyword($crate::lexing::Keyword::r#struct) }; + [enum] => { $crate::lexing::TokenKind::Keyword($crate::lexing::Keyword::r#enum) }; // This is only works for checking for a identifier // see the `same_kind` method on TokenKind diff --git a/trixy/trixy-lang_parser/src/lexing/tokenizer.rs b/trixy/trixy-lang_parser/src/lexing/tokenizer.rs index af46d43..3e78ed7 100644 --- a/trixy/trixy-lang_parser/src/lexing/tokenizer.rs +++ b/trixy/trixy-lang_parser/src/lexing/tokenizer.rs @@ -91,8 +91,6 @@ impl<'a> Tokenizer<'a> { remaining = &remaining[ws..]; ws }; - // let comments = skip_comments(remaining); - // remaining = &remaining[comments..]; let skip = self.remaining_text.len() - remaining.len(); self.chomp(skip); @@ -128,6 +126,8 @@ fn tokenize_ident(text: &str) -> Result<(TokenKind, usize), LexingError> { let tokenkind = match got { "nasp" => TokenKind::Keyword(Keyword::nasp), "fn" => TokenKind::Keyword(Keyword::r#fn), + "struct" => TokenKind::Keyword(Keyword::r#struct), + "enum" => TokenKind::Keyword(Keyword::r#enum), other => TokenKind::Identifier(other.to_string()), }; diff --git a/trixy/trixy-lang_parser/src/parsing/unchecked.rs b/trixy/trixy-lang_parser/src/parsing/unchecked.rs index 9d12a9e..07f9423 100644 --- a/trixy/trixy-lang_parser/src/parsing/unchecked.rs +++ b/trixy/trixy-lang_parser/src/parsing/unchecked.rs @@ -1,5 +1,7 @@ use crate::{ - command_spec::unchecked::{CommandSpec, Declaration, Function, FunctionInput}, + command_spec::unchecked::{ + CommandSpec, Declaration, Enumeration, Function, NamedType, Structure, + }, error::ErrorContext, lexing::{Token, TokenKind, TokenStream}, token, @@ -52,6 +54,14 @@ impl Parser { self.parse_function()?, self.current_namespaces.clone(), )]), + token![struct] => Ok(vec![Declaration::new_structure( + self.parse_structure()?, + self.current_namespaces.clone(), + )]), + token![enum] => Ok(vec![Declaration::new_enumeration( + self.parse_enumeration()?, + self.current_namespaces.clone(), + )]), _ => { let err = ParsingError::ExpectedKeyword { span: *self.peek().span(), @@ -79,20 +89,73 @@ impl Parser { Ok(declarations) } + fn parse_enumeration(&mut self) -> Result { + self.expect(token![enum])?; + let identifier = self.expect(token![Ident])?; + self.expect(token![BraceOpen])?; + + let mut states = vec![]; + if self.expect_peek(token![Ident]) { + states.push(self.expect(token![Ident])?); + } + while self.expect_peek(token![Comma]) { + self.expect(token![Comma])?; + if self.expect_peek(token![Ident]) { + states.push(self.expect(token![Ident])?); + } else { + break; + } + } + self.expect(token![BraceClose])?; + self.expect(token![;])?; + Ok(Enumeration { identifier, states }) + } + + fn parse_structure(&mut self) -> Result { + self.expect(token![struct])?; + let name = self.expect(token![Ident])?; + self.expect(token![BraceOpen])?; + + let mut contents = vec![]; + if self.expect_peek(token![Ident]) { + contents.push(self.parse_named_type()?); + } + while self.expect_peek(token![Comma]) { + self.expect(token![Comma])?; + if self.expect_peek(token![Ident]) { + contents.push(self.parse_named_type()?); + } else { + break; + } + } + self.expect(token![BraceClose])?; + self.expect(token![;])?; + + Ok(Structure { + identifier: name, + contents, + }) + } + + fn parse_named_type(&mut self) -> Result { + let name = self.expect(token![Ident])?; + self.expect(token![Colon])?; + let r#type = self.expect(token![Ident])?; + Ok(NamedType { name, r#type }) + } + fn parse_function(&mut self) -> Result { self.expect(token![fn])?; let name = self.expect(token![Ident])?; self.expect(token![ParenOpen])?; let mut inputs = vec![]; - while self.expect_peek(token![Ident]) { - let input_name = self.expect(token![Ident])?; - self.expect(token![Colon])?; - let input_type = self.expect(token![Ident])?; - inputs.push(FunctionInput { - name: input_name, - r#type: input_type, - }) + if self.expect_peek(token![Ident]) { + inputs.push(self.parse_named_type()?); + } + while self.expect_peek(token![Comma]) { + self.expect(token![Comma])?; + inputs.push(self.parse_named_type()?); } self.expect(token![ParenClose])?;