parser.go 227 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415
  1. // Copyright 2022 The Gc Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package gc // modernc.org/gc/v3
  5. import (
  6. "go/constant"
  7. "go/token"
  8. "path/filepath"
  9. "reflect"
  10. "runtime"
  11. "sort"
  12. "strings"
  13. "modernc.org/mathutil"
  14. "modernc.org/strutil"
  15. )
  16. // === RUN TestTypeCheck/GOROOT
  17. // === CONT TestTypeCheck
  18. // all_test.go:1123: TOTAL packages 516, files 2,301, skip 0, ok 516, fail 0
  19. // all_test.go:1127: pkg count 516, heap 626,182,264
  20. // --- PASS: TestTypeCheck (2.28s)
  21. // --- PASS: TestTypeCheck/GOROOT (2.12s)
  22. // all_test.go:1127: pkg count 516, heap 626,153,184
  23. // all_test.go:1128: pkg count 516, heap 590,057,064
  24. // all_test.go:1128: pkg count 516, heap 572,015,152
  25. // all_test.go:1129: pkg count 516, heap 567,709,952
  26. // all_test.go:1129: pkg count 516, heap 555,500,960
  27. // all_test.go:1129: pkg count 516, heap 551,777,488
  28. // all_test.go:1129: pkg count 516, heap 548,683,512
  29. // all_test.go:1129: pkg count 516, heap 548,447,936
  30. // all_test.go:1129: pkg count 516, heap 547,480,288
  31. // all_test.go:1129: pkg count 516, heap 546,915,592
  32. // all_test.go:1129: pkg count 516, heap 543,393,136
  33. // all_test.go:1129: pkg count 516, heap 544,638,544
  34. // all_test.go:1129: pkg count 516, heap 474,343,936
  35. // all_test.go:1129: pkg count 516, heap 459,353,840
  36. // all_test.go:1129: pkg count 516, heap 457,275,512
  37. // all_test.go:1129: pkg count 516, heap 455,355,680
  38. // all_test.go:1129: pkg count 516, heap 454,663,568
  39. // all_test.go:1129: pkg count 516, heap 454,581,072
  40. // all_test.go:1129: pkg count 516, heap 454,607,112
  41. // all_test.go:1129: pkg count 516, heap 454,709,968
  42. // all_test.go:1129: pkg count 516, heap 455,312,784
  43. // all_test.go:1129: pkg count 516, heap 456,016,824
  44. // all_test.go:1129: pkg count 516, heap 455,954,544
  45. // all_test.go:1129: pkg count 516, heap 456,016,592
  46. // all_test.go:1129: pkg count 516, heap 457,121,224
  47. // all_test.go:1129: pkg count 516, heap 427,262,960
  48. // all_test.go:1130: pkg count 516, heap 428,998,600
  49. // all_test.go:1130: pkg count 551, heap 448,395,152
  50. // all_test.go:1130: pkg count 551, heap 451,817,616
  51. // all_test.go:1131: pkg count 551, heap 452,091,200
  52. // all_test.go:1131: pkg count 551, heap 452,999,840
  53. // <total> x 16,603,469 = 892,265,816 á 54
  54. // <total> x 16,024,194 = 887,787,224 á 55
  55. // <total> x 16,025,144 = 888,006,760 á 55
  56. // <total> x 16,025,211 = 823,222,088 á 51
  57. // <total> x 16,025,281 = 822,404,264 á 51
  58. // <total> x 14,056,450 = 696,398,872 á 50
  59. // <total> x 14,056,581 = 696,851,856 á 50
  60. // <total> x 14,056,453 = 708,480,848 á 50
  61. // <total> x 14,422,414 = 719,035,680 á 50
  62. // <total> x 14,423,240 = 717,114,200 á 50
  63. // <total> x 14,425,901 = 711,567,152 á 49
  64. // <total> x 14,474,065 = 710,068,032 á 49
  65. // <total> x 14,481,041 = 710,373,680 á 49
  66. // <total> x 14,481,767 = 710,408,768 á 49
  67. // <total> x 14,484,493 = 710,543,264 á 49
  68. // <total> x 14,461,141 = 706,268,448 á 49
  69. // <total> x 14,461,182 = 707,678,232 á 49
  70. // <total> x 14,461,242 = 714,720,336 á 49
  71. // <total> x 14,461,219 = 797,198,184 á 55
  72. // <total> x 14,461,496 = 797,214,104 á 55
  73. // <total> x 14,461,329 = 716,132,376 á 50
  74. // <total> x 14,461,680 = 711,984,376 á 49
  75. // <total> x 14,160,586 = 702,969,536 á 50
  76. // <total> x 14,160,709 = 682,184,664 á 48
  77. // <total> x 14,160,848 = 673,044,152 á 48
  78. // <total> x 14,160,317 = 665,980,184 á 47
  79. // <total> x 14,005,861 = 661,267,672 á 47
  80. // <total> x 13,983,296 = 660,781,720 á 47
  81. // <total> x 13,943,950 = 660,175,016 á 47
  82. // <total> x 13,943,178 = 647,906,568 á 46
  83. // <total> x 13,924,463 = 648,999,976 á 47
  84. // <total> x 13,322,751 = 541,059,736 á 41
  85. // <total> x 12,815,541 = 510,052,400 á 40
  86. // <total> x 12,815,675 = 506,593,488 á 40
  87. // <total> x 12,639,779 = 500,965,136 á 40
  88. // <total> x 12,640,847 = 501,008,776 á 40
  89. // <total> x 12,603,003 = 499,658,832 á 40
  90. // <total> x 12,603,001 = 502,473,720 á 40
  91. // <total> x 12,602,667 = 505,274,416 á 40
  92. // <total> x 12,603,389 = 505,302,936 á 40
  93. // <total> x 12,604,481 = 507,314,552 á 40
  94. // <total> x 12,590,468 = 454,314,392 á 36
  95. // <total> x 12,591,896 = 456,980,832 á 36
  96. // <total> x 12,597,633 = 457,211,632 á 36
  97. // <total> x 12,597,637 = 458,714,592 á 36
  98. // <total> x 12,931,431 = 471,180,992 á 36
  99. // <total> x 12,931,309 = 481,877,912 á 37
  100. // <total> x 12,933,798 = 482,402,192 á 37
  101. // <total> x 12,934,587 = 483,606,808 á 37
  102. const parserBudget = 1e7
  103. var (
  104. noBack bool
  105. panicBack bool
  106. )
  107. type visibiliter interface {
  108. Node
  109. Visible() int
  110. setVisible(int32)
  111. }
  112. type visible struct {
  113. visible int32 // first token index where n is visible
  114. }
  115. // Visible reports the first token index where n is visible (in scope). Applies
  116. // to local scopes only.
  117. func (n *visible) Visible() int { return int(n.visible) }
  118. func (n *visible) setVisible(i int32) { n.visible = i }
  119. type named struct {
  120. n visibiliter
  121. declTok Token
  122. }
  123. type ScopeKind int
  124. const (
  125. scZero ScopeKind = iota
  126. UniverseScope
  127. PackageScope
  128. FileScope
  129. OtherScope
  130. )
  131. type Scope struct {
  132. nodes map[string]named
  133. parent *Scope
  134. kind ScopeKind
  135. }
  136. func newScope(parent *Scope, kind ScopeKind) *Scope { return &Scope{parent: parent, kind: kind} }
  137. func (s *Scope) Iterate(f func(name string, n Node) (stop bool)) {
  138. for name, v := range s.nodes {
  139. if f(name, v.n) {
  140. return
  141. }
  142. }
  143. }
  144. func (s *Scope) Kind() ScopeKind { return s.kind }
  145. func (s *Scope) Parent() *Scope { return s.parent }
  146. func (s *Scope) declare(nm Token, n visibiliter, visible int32, p *parser, initOK bool) (r named) {
  147. snm := nm.Src()
  148. switch snm {
  149. case "_":
  150. return r
  151. case "init":
  152. if s.kind == PackageScope {
  153. if p != nil && !initOK && p.reportDeclarationErrors {
  154. p.err(nm.Position(), "in the package block, the identifier init may only be used for init function declarations")
  155. }
  156. return r
  157. }
  158. }
  159. if ex, ok := s.nodes[snm]; ok {
  160. return ex
  161. }
  162. if s.nodes == nil {
  163. s.nodes = map[string]named{}
  164. }
  165. // trc("%v: add %s %p", nm.Position(), snm, s)
  166. n.setVisible(visible)
  167. s.nodes[snm] = named{n, nm}
  168. return r
  169. }
  170. func (s *Scope) lookup(id Token) (in *Scope, r named) {
  171. nm := id.Src()
  172. ix := int(id.index)
  173. for s != nil {
  174. switch s.kind {
  175. case PackageScope, UniverseScope:
  176. ix = -1
  177. }
  178. sc, ok := s.nodes[nm]
  179. if ok && (ix < 0 || ix > sc.n.Visible()) {
  180. return s, sc
  181. }
  182. s = s.parent
  183. }
  184. return nil, r
  185. }
  186. type lexicalScoper struct{ s *Scope }
  187. func newLexicalScoper(s *Scope) lexicalScoper { return lexicalScoper{s} }
  188. func (n *lexicalScoper) LexicalScope() *Scope { return n.s }
  189. // Node is an item of the CST tree.
  190. type Node interface {
  191. Position() token.Position
  192. Source(full bool) string
  193. }
  194. var hooks = strutil.PrettyPrintHooks{
  195. reflect.TypeOf(Token{}): func(f strutil.Formatter, v interface{}, prefix, suffix string) {
  196. t := v.(Token)
  197. if !t.IsValid() {
  198. return
  199. }
  200. pos := t.Position()
  201. if pos.Filename != "" {
  202. pos.Filename = filepath.Base(pos.Filename)
  203. }
  204. f.Format(string(prefix)+"%10s %q %q\t(%v:)"+string(suffix), tokSource(t.Ch()), t.Sep(), t.Src(), pos)
  205. },
  206. }
  207. func dump(n Node) string { return strutil.PrettyString(n, "", "", hooks) }
  208. // NodeSource returns the source text of 'n'. If 'full' is false, every non
  209. // empty separator is replaced by a single space. Nodes found in 'kill' are
  210. // skipped, transitively.
  211. func NodeSource(n Node, full bool, kill map[Node]struct{}) string {
  212. return nodeSource2(n, full, kill)
  213. }
  214. func nodeSource(n interface{}, full bool) string {
  215. return nodeSource2(n, full, nil)
  216. }
  217. func nodeSource2(n interface{}, full bool, kill map[Node]struct{}) string {
  218. var a []int32
  219. var t Token
  220. nodeSource0(&t.source, &a, n, kill)
  221. if len(a) == 0 {
  222. return ""
  223. }
  224. var b strings.Builder
  225. sort.Slice(a, func(i, j int) bool { return a[i] < a[j] })
  226. for _, v := range a {
  227. t.index = v
  228. t.ch = t.source.toks[t.index].ch
  229. b.WriteString(t.Source(full))
  230. }
  231. return b.String()
  232. }
  233. func nodeSource0(ps **source, a *[]int32, n interface{}, kill map[Node]struct{}) {
  234. if x, ok := n.(Node); ok {
  235. if _, ok := kill[x]; ok {
  236. return
  237. }
  238. }
  239. switch x := n.(type) {
  240. case nil:
  241. // nop
  242. case Token:
  243. if x.IsValid() {
  244. *ps = x.source
  245. *a = append(*a, x.index)
  246. }
  247. case *BasicLitNode:
  248. if x.IsValid() {
  249. *ps = x.source
  250. *a = append(*a, x.index)
  251. }
  252. default:
  253. t := reflect.TypeOf(n)
  254. v := reflect.ValueOf(n)
  255. if v.IsZero() {
  256. break
  257. }
  258. switch t.Kind() {
  259. case reflect.Pointer:
  260. nodeSource0(ps, a, v.Elem().Interface(), kill)
  261. case reflect.Struct:
  262. for i := 0; i < t.NumField(); i++ {
  263. if token.IsExported(t.Field(i).Name) {
  264. nodeSource0(ps, a, v.Field(i).Interface(), kill)
  265. }
  266. }
  267. case reflect.Slice:
  268. for i := 0; i < v.Len(); i++ {
  269. nodeSource0(ps, a, v.Index(i).Interface(), kill)
  270. }
  271. default:
  272. panic(todo("", t.Name(), t.Kind()))
  273. }
  274. }
  275. }
  276. type AST struct {
  277. EOF Token
  278. FileScope *Scope
  279. SourceFile *SourceFileNode
  280. packageScope *Scope // For the individual file, enables parallelism, consolidated by Package.check()
  281. }
  282. func (n *AST) Source(full bool) string { return nodeSource(n, full) }
  283. func (n *AST) Position() (r token.Position) {
  284. if n == nil {
  285. return r
  286. }
  287. return n.SourceFile.Position()
  288. }
  289. type parser struct {
  290. a *analyzer
  291. fileScope *Scope
  292. maxBackOrigin string
  293. maxBackRange [2]int
  294. packageScope *Scope
  295. path string
  296. s *scanner
  297. sc *Scope
  298. backs int
  299. budget int
  300. ix int
  301. maxBack int
  302. maxIx int
  303. isClosed bool
  304. record bool
  305. reportDeclarationErrors bool
  306. }
  307. func newParser(pkgScope *Scope, path string, src []byte, record bool) *parser {
  308. return &parser{
  309. a: newAnalyzer(),
  310. budget: parserBudget,
  311. fileScope: newScope(pkgScope, FileScope),
  312. packageScope: pkgScope,
  313. path: path,
  314. record: record,
  315. s: newScanner(path, src),
  316. sc: pkgScope,
  317. }
  318. }
  319. func (p *parser) c() token.Token { return p.peek(0) }
  320. func (p *parser) closeScope() { p.sc = p.sc.parent }
  321. func (p *parser) errPosition() (r token.Position) { return p.s.toks[p.maxIx].position(p.s.source) }
  322. func (p *parser) openScope() { p.sc = newScope(p.sc, OtherScope) }
  323. func (p *parser) pos() (r token.Position) {
  324. return p.s.toks[mathutil.MinInt32(int32(p.ix), int32(len(p.s.toks)-1))].position(p.s.source)
  325. }
  326. func (p *parser) err(pos token.Position, msg string, args ...interface{}) {
  327. p.s.errs.err(pos, msg, args...)
  328. }
  329. func (p *parser) declare(s *Scope, nm Token, n visibiliter, visible int32, initOK bool) {
  330. if ex := s.declare(nm, n, visible, p, initOK); ex.declTok.IsValid() && p.reportDeclarationErrors {
  331. p.err(nm.Position(), "%s redeclared, previous declaration at %v:", nm.Src(), ex.declTok.Position())
  332. }
  333. }
  334. func (p *parser) consume() (r Token) {
  335. r = Token{p.s.source, p.s.toks[p.ix].ch, int32(p.ix)}
  336. p.ix++
  337. p.budget--
  338. return r
  339. }
  340. func (p *parser) accept(t token.Token) (r Token, _ bool) {
  341. if p.c() == t {
  342. return p.consume(), true
  343. }
  344. return r, false
  345. }
  346. func (p *parser) expect(t token.Token) (r Token) {
  347. var ok bool
  348. if r, ok = p.accept(t); !ok {
  349. p.isClosed = true
  350. }
  351. return r
  352. }
  353. func (p *parser) peek(n int) token.Token {
  354. for p.ix+n >= len(p.s.toks) {
  355. if p.budget <= 0 || p.isClosed {
  356. return EOF
  357. }
  358. p.s.scan()
  359. if p.s.isClosed {
  360. p.isClosed = true
  361. }
  362. }
  363. p.maxIx = mathutil.Max(p.maxIx, p.ix)
  364. return token.Token(p.s.toks[p.ix+n].ch)
  365. }
  366. func (p *parser) recordBacktrack(ix int, record bool) {
  367. delta := p.ix - ix
  368. p.backs += delta
  369. if delta > p.maxBack {
  370. p.maxBack = delta
  371. p.maxBackRange = [2]int{ix, p.ix}
  372. p.maxBackOrigin = origin(3)
  373. }
  374. p.ix = ix
  375. if p.record && record {
  376. if _, _, line, ok := runtime.Caller(2); ok {
  377. p.a.record(line, delta)
  378. }
  379. }
  380. }
  381. func (p *parser) back(ix int) {
  382. p.recordBacktrack(ix, true)
  383. if p.isClosed {
  384. return
  385. }
  386. if noBack {
  387. p.isClosed = true
  388. }
  389. if panicBack {
  390. panic(todo("%v: (%v:)", p.errPosition(), origin(2)))
  391. }
  392. }
  393. func (p *parser) parse() (ast *AST, err error) {
  394. if p.c() != PACKAGE {
  395. p.s.errs.err(p.errPosition(), "syntax error")
  396. return nil, p.s.errs
  397. }
  398. sourceFile := p.sourceFile()
  399. if p.budget <= 0 {
  400. return nil, errorf("%s: resources exhausted", p.path)
  401. }
  402. if eof, ok := p.accept(EOF); ok && p.ix == len(p.s.toks) {
  403. return &AST{packageScope: p.packageScope, FileScope: p.fileScope, SourceFile: sourceFile, EOF: eof}, p.s.errs.Err()
  404. }
  405. p.s.errs.err(p.errPosition(), "syntax error")
  406. return nil, p.s.errs
  407. }
  408. type BinaryExpressionNode struct {
  409. LHS Expression
  410. Op Token
  411. RHS Expression
  412. typeCache
  413. valueCache
  414. }
  415. // Position implements Node.
  416. func (n *BinaryExpressionNode) Position() (r token.Position) {
  417. if n == nil {
  418. return r
  419. }
  420. return n.LHS.Position()
  421. }
  422. // Source implements Node.
  423. func (n *BinaryExpressionNode) Source(full bool) string { return nodeSource(n, full) }
  424. func (p *parser) additiveExpression(preBlock bool) (r Expression) {
  425. var multiplicativeExpression Expression
  426. // ebnf.Sequence MultiplicativeExpression { ( "+" | "-" | "|" | "^" ) MultiplicativeExpression } ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  427. {
  428. ix := p.ix
  429. // *ebnf.Name MultiplicativeExpression ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  430. if multiplicativeExpression = p.multiplicativeExpression(preBlock); multiplicativeExpression == nil {
  431. p.back(ix)
  432. return nil
  433. }
  434. // *ebnf.Repetition { ( "+" | "-" | "|" | "^" ) MultiplicativeExpression } ctx []
  435. r = multiplicativeExpression
  436. _0:
  437. {
  438. var op Token
  439. var multiplicativeExpression Expression
  440. switch p.c() {
  441. case ADD, OR, SUB, XOR:
  442. // ebnf.Sequence ( "+" | "-" | "|" | "^" ) MultiplicativeExpression ctx [ADD, OR, SUB, XOR]
  443. // *ebnf.Group ( "+" | "-" | "|" | "^" ) ctx [ADD, OR, SUB, XOR]
  444. // ebnf.Alternative "+" | "-" | "|" | "^" ctx [ADD, OR, SUB, XOR]
  445. op = p.consume()
  446. // *ebnf.Name MultiplicativeExpression ctx []
  447. switch p.c() {
  448. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  449. if multiplicativeExpression = p.multiplicativeExpression(preBlock); multiplicativeExpression == nil {
  450. p.back(ix)
  451. goto _1
  452. }
  453. default:
  454. p.back(ix)
  455. goto _1
  456. }
  457. r = &BinaryExpressionNode{LHS: r, Op: op, RHS: multiplicativeExpression}
  458. goto _0
  459. }
  460. _1:
  461. }
  462. }
  463. return r
  464. }
  465. // AliasDeclNode represents the production
  466. //
  467. // AliasDecl = identifier "=" Type .
  468. type AliasDeclNode struct {
  469. IDENT Token
  470. ASSIGN Token
  471. TypeNode Type
  472. visible
  473. }
  474. // Source implements Node.
  475. func (n *AliasDeclNode) Source(full bool) string { return nodeSource(n, full) }
  476. // Position implements Node.
  477. func (n *AliasDeclNode) Position() (r token.Position) {
  478. if n == nil {
  479. return r
  480. }
  481. return n.IDENT.Position()
  482. }
  483. func (p *parser) aliasDecl() (r *AliasDeclNode) {
  484. var (
  485. identTok Token
  486. assignTok Token
  487. typeNode Type
  488. )
  489. // ebnf.Sequence identifier "=" Type ctx [IDENT]
  490. {
  491. if p.peek(1) != ASSIGN {
  492. return nil
  493. }
  494. ix := p.ix
  495. // *ebnf.Name identifier ctx [IDENT]
  496. identTok = p.expect(IDENT)
  497. // *ebnf.Token "=" ctx [ASSIGN]
  498. assignTok = p.expect(ASSIGN)
  499. // *ebnf.Name Type ctx []
  500. switch p.c() {
  501. case ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT:
  502. if typeNode = p.type1(); typeNode == nil {
  503. p.back(ix)
  504. return nil
  505. }
  506. default:
  507. p.back(ix)
  508. return nil
  509. }
  510. }
  511. r = &AliasDeclNode{
  512. IDENT: identTok,
  513. ASSIGN: assignTok,
  514. TypeNode: typeNode,
  515. }
  516. p.declare(p.sc, identTok, r, int32(p.ix), false)
  517. return r
  518. }
  519. // ArgumentsNode represents the production
  520. //
  521. // Arguments = "(" [ Expression ] ")" .
  522. type ArgumentsNode struct {
  523. LPAREN Token
  524. Expression Expression
  525. RPAREN Token
  526. }
  527. // Source implements Node.
  528. func (n *ArgumentsNode) Source(full bool) string { return nodeSource(n, full) }
  529. // Position implements Node.
  530. func (n *ArgumentsNode) Position() (r token.Position) {
  531. if n == nil {
  532. return r
  533. }
  534. return n.LPAREN.Position()
  535. }
  536. // Arguments1Node represents the production
  537. //
  538. // Arguments = "(" [ ( Expression | Type [ "," Expression ] ) [ "..." ] [ "," ] ] ")" .
  539. type Arguments1Node struct {
  540. LPAREN Token
  541. Expression Expression
  542. TypeNode Type
  543. COMMA Token
  544. ELLIPSIS Token
  545. COMMA2 Token
  546. RPAREN Token
  547. }
  548. // Source implements Node.
  549. func (n *Arguments1Node) Source(full bool) string { return nodeSource(n, full) }
  550. // Position implements Node.
  551. func (n *Arguments1Node) Position() (r token.Position) {
  552. if n == nil {
  553. return r
  554. }
  555. return n.LPAREN.Position()
  556. }
  557. // Arguments2Node represents the production
  558. //
  559. // Arguments = "(" ExpressionList ")" .
  560. type Arguments2Node struct {
  561. LPAREN Token
  562. ExpressionList *ExpressionListNode
  563. RPAREN Token
  564. }
  565. // Source implements Node.
  566. func (n *Arguments2Node) Source(full bool) string { return nodeSource(n, full) }
  567. // Position implements Node.
  568. func (n *Arguments2Node) Position() (r token.Position) {
  569. if n == nil {
  570. return r
  571. }
  572. return n.LPAREN.Position()
  573. }
  574. // Arguments3Node represents the production
  575. //
  576. // Arguments = "(" [ ( ExpressionList | Type [ "," ExpressionList ] ) [ "..." ] [ "," ] ] ")" .
  577. type Arguments3Node struct {
  578. LPAREN Token
  579. ExpressionList *ExpressionListNode
  580. TypeNode Type
  581. COMMA Token
  582. ELLIPSIS Token
  583. COMMA2 Token
  584. RPAREN Token
  585. }
  586. // Source implements Node.
  587. func (n *Arguments3Node) Source(full bool) string { return nodeSource(n, full) }
  588. // Position implements Node.
  589. func (n *Arguments3Node) Position() (r token.Position) {
  590. if n == nil {
  591. return r
  592. }
  593. return n.LPAREN.Position()
  594. }
  595. func (p *parser) arguments() Node {
  596. var (
  597. ok bool
  598. lparenTok Token
  599. expressionList *ExpressionListNode
  600. typeNode Type
  601. commaTok Token
  602. ellipsisTok Token
  603. comma2Tok Token
  604. rparenTok Token
  605. )
  606. // ebnf.Sequence "(" [ ( ExpressionList | Type [ "," ExpressionList ] ) [ "..." ] [ "," ] ] ")" ctx [LPAREN]
  607. {
  608. ix := p.ix
  609. // *ebnf.Token "(" ctx [LPAREN]
  610. lparenTok = p.expect(LPAREN)
  611. // *ebnf.Option [ ( ExpressionList | Type [ "," ExpressionList ] ) [ "..." ] [ "," ] ] ctx []
  612. switch p.c() {
  613. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  614. // ebnf.Sequence ( ExpressionList | Type [ "," ExpressionList ] ) [ "..." ] [ "," ] ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  615. {
  616. ix := p.ix
  617. // *ebnf.Group ( ExpressionList | Type [ "," ExpressionList ] ) ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  618. // ebnf.Alternative ExpressionList | Type [ "," ExpressionList ] ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  619. switch p.c() {
  620. case ADD, AND, CHAR, FLOAT, IMAG, INT, NOT, STRING, SUB, XOR: // 0
  621. // *ebnf.Name ExpressionList ctx [ADD, AND, CHAR, FLOAT, IMAG, INT, NOT, STRING, SUB, XOR]
  622. if expressionList = p.expressionList(false); expressionList == nil {
  623. goto _2
  624. }
  625. break
  626. _2:
  627. expressionList = nil
  628. p.back(ix)
  629. goto _0
  630. case ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT: // 0 1
  631. // *ebnf.Name ExpressionList ctx [ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT]
  632. if expressionList = p.expressionList(false); expressionList == nil {
  633. goto _4
  634. }
  635. break
  636. _4:
  637. expressionList = nil
  638. // ebnf.Sequence Type [ "," ExpressionList ] ctx [ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT]
  639. {
  640. ix := p.ix
  641. // *ebnf.Name Type ctx [ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT]
  642. if typeNode = p.type1(); typeNode == nil {
  643. p.back(ix)
  644. goto _5
  645. }
  646. // *ebnf.Option [ "," ExpressionList ] ctx []
  647. switch p.c() {
  648. case COMMA:
  649. // ebnf.Sequence "," ExpressionList ctx [COMMA]
  650. {
  651. switch p.peek(1) {
  652. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  653. default:
  654. goto _6
  655. }
  656. ix := p.ix
  657. // *ebnf.Token "," ctx [COMMA]
  658. commaTok = p.expect(COMMA)
  659. // *ebnf.Name ExpressionList ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  660. if expressionList = p.expressionList(false); expressionList == nil {
  661. p.back(ix)
  662. goto _6
  663. }
  664. }
  665. }
  666. goto _7
  667. _6:
  668. commaTok = Token{}
  669. expressionList = nil
  670. _7:
  671. }
  672. break
  673. _5:
  674. commaTok = Token{}
  675. expressionList = nil
  676. typeNode = nil
  677. p.back(ix)
  678. goto _0
  679. default:
  680. p.back(ix)
  681. goto _0
  682. }
  683. // *ebnf.Option [ "..." ] ctx []
  684. switch p.c() {
  685. case ELLIPSIS:
  686. // *ebnf.Token "..." ctx [ELLIPSIS]
  687. ellipsisTok = p.expect(ELLIPSIS)
  688. }
  689. // *ebnf.Option [ "," ] ctx []
  690. switch p.c() {
  691. case COMMA:
  692. // *ebnf.Token "," ctx [COMMA]
  693. comma2Tok = p.expect(COMMA)
  694. }
  695. }
  696. }
  697. goto _1
  698. _0:
  699. comma2Tok = Token{}
  700. ellipsisTok = Token{}
  701. expressionList = nil
  702. _1:
  703. // *ebnf.Token ")" ctx []
  704. if rparenTok, ok = p.accept(RPAREN); !ok {
  705. p.back(ix)
  706. return nil
  707. }
  708. }
  709. switch expressionList.Len() {
  710. case 0, 1:
  711. if typeNode == nil && !commaTok.IsValid() && !ellipsisTok.IsValid() && !comma2Tok.IsValid() {
  712. return &ArgumentsNode{
  713. LPAREN: lparenTok,
  714. Expression: expressionList.first(),
  715. RPAREN: rparenTok,
  716. }
  717. }
  718. return &Arguments1Node{
  719. LPAREN: lparenTok,
  720. Expression: expressionList.first(),
  721. TypeNode: typeNode,
  722. COMMA: commaTok,
  723. ELLIPSIS: ellipsisTok,
  724. COMMA2: comma2Tok,
  725. RPAREN: rparenTok,
  726. }
  727. default:
  728. if typeNode == nil && !commaTok.IsValid() && !ellipsisTok.IsValid() && !comma2Tok.IsValid() {
  729. return &Arguments2Node{
  730. LPAREN: lparenTok,
  731. ExpressionList: expressionList,
  732. RPAREN: rparenTok,
  733. }
  734. }
  735. return &Arguments3Node{
  736. LPAREN: lparenTok,
  737. ExpressionList: expressionList,
  738. TypeNode: typeNode,
  739. COMMA: commaTok,
  740. ELLIPSIS: ellipsisTok,
  741. COMMA2: comma2Tok,
  742. RPAREN: rparenTok,
  743. }
  744. }
  745. }
  746. func (p *parser) arrayLength() Expression {
  747. // *ebnf.Name Expression ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  748. return p.expression(false)
  749. }
  750. // ArrayTypeNode represents the production
  751. //
  752. // ArrayType = "[" ArrayLength "]" ElementType .
  753. type ArrayTypeNode struct {
  754. LBRACK Token
  755. ArrayLength Expression
  756. RBRACK Token
  757. ElementType Type
  758. }
  759. // Source implements Node.
  760. func (n *ArrayTypeNode) Source(full bool) string { return nodeSource(n, full) }
  761. // Position implements Node.
  762. func (n *ArrayTypeNode) Position() (r token.Position) {
  763. if n == nil {
  764. return r
  765. }
  766. return n.LBRACK.Position()
  767. }
  768. func (p *parser) arrayType() *ArrayTypeNode {
  769. var (
  770. ok bool
  771. lbrackTok Token
  772. arrayLength Expression
  773. rbrackTok Token
  774. elementType Type
  775. )
  776. // ebnf.Sequence "[" ArrayLength "]" ElementType ctx [LBRACK]
  777. {
  778. switch p.peek(1) {
  779. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  780. default:
  781. return nil
  782. }
  783. ix := p.ix
  784. // *ebnf.Token "[" ctx [LBRACK]
  785. lbrackTok = p.expect(LBRACK)
  786. // *ebnf.Name ArrayLength ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  787. if arrayLength = p.arrayLength(); arrayLength == nil {
  788. p.back(ix)
  789. return nil
  790. }
  791. // *ebnf.Token "]" ctx []
  792. if rbrackTok, ok = p.accept(RBRACK); !ok {
  793. p.back(ix)
  794. return nil
  795. }
  796. // *ebnf.Name ElementType ctx []
  797. switch p.c() {
  798. case ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT:
  799. if elementType = p.type1(); elementType == nil {
  800. p.back(ix)
  801. return nil
  802. }
  803. default:
  804. p.back(ix)
  805. return nil
  806. }
  807. }
  808. return &ArrayTypeNode{
  809. LBRACK: lbrackTok,
  810. ArrayLength: arrayLength,
  811. RBRACK: rbrackTok,
  812. ElementType: elementType,
  813. }
  814. }
  815. // AssignmentNode represents the production
  816. //
  817. // Assignment = ExpressionList ( "=" | "+=" | "-=" | "|=" | "^=" | "*=" | "/=" | "%=" | "<<=" | ">>=" | "&=" | "&^=" ) ExpressionList .
  818. type AssignmentNode struct {
  819. ExpressionList *ExpressionListNode
  820. Op Token
  821. ExpressionList2 *ExpressionListNode
  822. }
  823. // Source implements Node.
  824. func (n *AssignmentNode) Source(full bool) string { return nodeSource(n, full) }
  825. // Position implements Node.
  826. func (n *AssignmentNode) Position() (r token.Position) {
  827. if n == nil {
  828. return r
  829. }
  830. panic("TODO")
  831. }
  832. func (p *parser) assignment(expressionList *ExpressionListNode, preBlock bool) *AssignmentNode {
  833. var (
  834. op Token
  835. expressionList2 *ExpressionListNode
  836. )
  837. // ebnf.Sequence ( "=" | "+=" | "-=" | "|=" | "^=" | "*=" | "/=" | "%=" | "<<=" | ">>=" | "&=" | "&^=" ) ExpressionList ctx [ADD_ASSIGN, AND_ASSIGN, AND_NOT_ASSIGN, ASSIGN, MUL_ASSIGN, OR_ASSIGN, QUO_ASSIGN, REM_ASSIGN, SHL_ASSIGN, SHR_ASSIGN, SUB_ASSIGN, XOR_ASSIGN]
  838. {
  839. ix := p.ix
  840. // *ebnf.Group ( "=" | "+=" | "-=" | "|=" | "^=" | "*=" | "/=" | "%=" | "<<=" | ">>=" | "&=" | "&^=" ) ctx [ADD_ASSIGN, AND_ASSIGN, AND_NOT_ASSIGN, ASSIGN, MUL_ASSIGN, OR_ASSIGN, QUO_ASSIGN, REM_ASSIGN, SHL_ASSIGN, SHR_ASSIGN, SUB_ASSIGN, XOR_ASSIGN]
  841. // ebnf.Alternative "=" | "+=" | "-=" | "|=" | "^=" | "*=" | "/=" | "%=" | "<<=" | ">>=" | "&=" | "&^=" ctx [ADD_ASSIGN, AND_ASSIGN, AND_NOT_ASSIGN, ASSIGN, MUL_ASSIGN, OR_ASSIGN, QUO_ASSIGN, REM_ASSIGN, SHL_ASSIGN, SHR_ASSIGN, SUB_ASSIGN, XOR_ASSIGN]
  842. op = p.consume()
  843. // *ebnf.Name ExpressionList ctx []
  844. switch p.c() {
  845. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  846. if expressionList2 = p.expressionList(preBlock); expressionList2 == nil {
  847. p.back(ix)
  848. return nil
  849. }
  850. default:
  851. p.back(ix)
  852. return nil
  853. }
  854. }
  855. return &AssignmentNode{
  856. ExpressionList: expressionList,
  857. Op: op,
  858. ExpressionList2: expressionList2,
  859. }
  860. }
  861. // BasicLitNode represents the production
  862. //
  863. // BasicLit = int_lit | float_lit | imaginary_lit | rune_lit | string_lit .
  864. type BasicLitNode struct {
  865. Token
  866. ctx *ctx
  867. }
  868. //TODO- // Source implements Node.
  869. //TODO- func (n *BasicLitNode) Source(full bool) string { return nodeSource(n, full) }
  870. //TODO-
  871. //TODO- // Position implements Node.
  872. //TODO- func (n *BasicLitNode) Position() (r token.Position) {
  873. //TODO- if !n.IsValid() {
  874. //TODO- return r
  875. //TODO- }
  876. //TODO-
  877. //TODO- return Token(*n).Position()
  878. //TODO- }
  879. //TODO-
  880. //TODO- func (n *BasicLitNode) Ch() token.Token { return Token(*n).Ch() }
  881. //TODO- func (n *BasicLitNode) IsValid() bool { return Token(*n).IsValid() }
  882. func (p *parser) basicLit() Expression {
  883. // ebnf.Alternative int_lit | float_lit | imaginary_lit | rune_lit | string_lit ctx [CHAR, FLOAT, IMAG, INT, STRING]
  884. t := p.consume()
  885. v := constant.MakeFromLiteral(t.Src(), token.Token(t.ch), 0)
  886. if v.Kind() == constant.Unknown {
  887. p.err(t.Position(), "invalid literal: %s", t.Src())
  888. }
  889. return &BasicLitNode{Token: t}
  890. }
  891. // BlockNode represents the production
  892. //
  893. // Block = "{" StatementList "}" .
  894. type BlockNode struct {
  895. LBRACE Token
  896. StatementList *StatementListNode
  897. RBRACE Token
  898. }
  899. // Source implements Node.
  900. func (n *BlockNode) Source(full bool) string { return nodeSource(n, full) }
  901. // Position implements Node.
  902. func (n *BlockNode) Position() (r token.Position) {
  903. if n == nil {
  904. return r
  905. }
  906. return n.LBRACE.Position()
  907. }
  908. func (p *parser) block(rx *ParametersNode, s *SignatureNode) *BlockNode {
  909. var (
  910. ok bool
  911. lbraceTok Token
  912. statementList *StatementListNode
  913. rbraceTok Token
  914. )
  915. // ebnf.Sequence "{" StatementList "}" ctx [LBRACE]
  916. {
  917. p.openScope()
  918. defer p.closeScope()
  919. ix := p.ix
  920. // *ebnf.Token "{" ctx [LBRACE]
  921. lbraceTok = p.expect(LBRACE)
  922. if rx != nil {
  923. rx.declare(p, p.sc)
  924. }
  925. if s != nil {
  926. s.Parameters.declare(p, p.sc)
  927. if s.Result != nil {
  928. s.Result.Parameters.declare(p, p.sc)
  929. }
  930. }
  931. // *ebnf.Name StatementList ctx []
  932. switch p.c() {
  933. case ADD, AND, ARROW, BREAK, CHAN, CHAR, CONST, CONTINUE, DEFER, FALLTHROUGH, FLOAT, FOR, FUNC, GO, GOTO, IDENT, IF, IMAG, INT, INTERFACE, LBRACE, LBRACK, LPAREN, MAP, MUL, NOT, RETURN, SELECT, SEMICOLON, STRING, STRUCT, SUB, SWITCH, TYPE, VAR, XOR /* ε */ :
  934. if statementList = p.statementList(); statementList == nil {
  935. p.back(ix)
  936. return nil
  937. }
  938. }
  939. // *ebnf.Token "}" ctx []
  940. if rbraceTok, ok = p.accept(RBRACE); !ok {
  941. p.back(ix)
  942. return nil
  943. }
  944. }
  945. return &BlockNode{
  946. LBRACE: lbraceTok,
  947. StatementList: statementList,
  948. RBRACE: rbraceTok,
  949. }
  950. }
  951. // BreakStmtNode represents the production
  952. //
  953. // BreakStmt = "break" [ Label ] .
  954. type BreakStmtNode struct {
  955. BREAK Token
  956. Label *LabelNode
  957. }
  958. // Source implements Node.
  959. func (n *BreakStmtNode) Source(full bool) string { return nodeSource(n, full) }
  960. // Position implements Node.
  961. func (n *BreakStmtNode) Position() (r token.Position) {
  962. if n == nil {
  963. return r
  964. }
  965. return n.BREAK.Position()
  966. }
  967. func (p *parser) breakStmt() *BreakStmtNode {
  968. var (
  969. breakTok Token
  970. label *LabelNode
  971. )
  972. // ebnf.Sequence "break" [ Label ] ctx [BREAK]
  973. {
  974. // *ebnf.Token "break" ctx [BREAK]
  975. breakTok = p.expect(BREAK)
  976. // *ebnf.Option [ Label ] ctx []
  977. switch p.c() {
  978. case IDENT:
  979. // *ebnf.Name Label ctx [IDENT]
  980. if label = p.label(); label == nil {
  981. goto _0
  982. }
  983. }
  984. goto _1
  985. _0:
  986. label = nil
  987. _1:
  988. }
  989. return &BreakStmtNode{
  990. BREAK: breakTok,
  991. Label: label,
  992. }
  993. }
  994. func (p *parser) channel() Expression {
  995. // *ebnf.Name Expression ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  996. return p.expression(false)
  997. }
  998. // ChannelTypeNode represents the production
  999. //
  1000. // ChannelType = ( "chan" "<-" | "chan" | "<-" "chan" ) ElementType .
  1001. type ChannelTypeNode struct {
  1002. CHAN Token
  1003. ARROW Token
  1004. ElementType Type
  1005. }
  1006. // Source implements Node.
  1007. func (n *ChannelTypeNode) Source(full bool) string { return nodeSource(n, full) }
  1008. // Position implements Node.
  1009. func (n *ChannelTypeNode) Position() (r token.Position) {
  1010. if n == nil {
  1011. return r
  1012. }
  1013. if n.ARROW.IsValid() && n.ARROW.index < n.CHAN.index {
  1014. return n.ARROW.Position()
  1015. }
  1016. return n.CHAN.Position()
  1017. }
  1018. func (p *parser) channelType() *ChannelTypeNode {
  1019. var (
  1020. chanTok Token
  1021. arrowTok Token
  1022. elementType Type
  1023. )
  1024. // ebnf.Sequence ( "chan" "<-" | "chan" | "<-" "chan" ) ElementType ctx [ARROW, CHAN]
  1025. {
  1026. ix := p.ix
  1027. // *ebnf.Group ( "chan" "<-" | "chan" | "<-" "chan" ) ctx [ARROW, CHAN]
  1028. // ebnf.Alternative "chan" "<-" | "chan" | "<-" "chan" ctx [ARROW, CHAN]
  1029. switch p.c() {
  1030. case CHAN: // 0 1
  1031. // ebnf.Sequence "chan" "<-" ctx [CHAN]
  1032. {
  1033. if p.peek(1) != ARROW {
  1034. goto _0
  1035. }
  1036. // *ebnf.Token "chan" ctx [CHAN]
  1037. chanTok = p.expect(CHAN)
  1038. // *ebnf.Token "<-" ctx [ARROW]
  1039. arrowTok = p.expect(ARROW)
  1040. }
  1041. break
  1042. _0:
  1043. arrowTok = Token{}
  1044. chanTok = Token{}
  1045. // *ebnf.Token "chan" ctx [CHAN]
  1046. chanTok = p.expect(CHAN)
  1047. break
  1048. p.back(ix)
  1049. return nil
  1050. case ARROW: // 2
  1051. // ebnf.Sequence "<-" "chan" ctx [ARROW]
  1052. {
  1053. if p.peek(1) != CHAN {
  1054. goto _2
  1055. }
  1056. // *ebnf.Token "<-" ctx [ARROW]
  1057. arrowTok = p.expect(ARROW)
  1058. // *ebnf.Token "chan" ctx [CHAN]
  1059. chanTok = p.expect(CHAN)
  1060. }
  1061. break
  1062. _2:
  1063. p.back(ix)
  1064. return nil
  1065. default:
  1066. p.back(ix)
  1067. return nil
  1068. }
  1069. // *ebnf.Name ElementType ctx []
  1070. switch p.c() {
  1071. case ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT:
  1072. if elementType = p.type1(); elementType == nil {
  1073. p.back(ix)
  1074. return nil
  1075. }
  1076. default:
  1077. p.back(ix)
  1078. return nil
  1079. }
  1080. }
  1081. return &ChannelTypeNode{
  1082. CHAN: chanTok,
  1083. ARROW: arrowTok,
  1084. ElementType: elementType,
  1085. }
  1086. }
  1087. // CommCaseNode represents the production
  1088. //
  1089. // CommCase = "case" ( SendStmt | RecvStmt ) | "default" .
  1090. type CommCaseNode struct {
  1091. CASE Token
  1092. SendStmt *SendStmtNode
  1093. RecvStmt *RecvStmtNode
  1094. DEFAULT Token
  1095. }
  1096. // Source implements Node.
  1097. func (n *CommCaseNode) Source(full bool) string { return nodeSource(n, full) }
  1098. // Position implements Node.
  1099. func (n *CommCaseNode) Position() (r token.Position) {
  1100. if n == nil {
  1101. return r
  1102. }
  1103. panic("TODO")
  1104. }
  1105. func (p *parser) commCase() *CommCaseNode {
  1106. var (
  1107. caseTok Token
  1108. sendStmt *SendStmtNode
  1109. recvStmt *RecvStmtNode
  1110. defaultTok Token
  1111. )
  1112. // ebnf.Alternative "case" ( SendStmt | RecvStmt ) | "default" ctx [CASE, DEFAULT]
  1113. switch p.c() {
  1114. case CASE: // 0
  1115. // ebnf.Sequence "case" ( SendStmt | RecvStmt ) ctx [CASE]
  1116. {
  1117. switch p.peek(1) {
  1118. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  1119. default:
  1120. goto _0
  1121. }
  1122. ix := p.ix
  1123. // *ebnf.Token "case" ctx [CASE]
  1124. caseTok = p.expect(CASE)
  1125. // *ebnf.Group ( SendStmt | RecvStmt ) ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  1126. // ebnf.Alternative SendStmt | RecvStmt ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  1127. switch p.c() {
  1128. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR: // 0 1
  1129. // *ebnf.Name SendStmt ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  1130. if sendStmt = p.sendStmt(); sendStmt == nil {
  1131. goto _2
  1132. }
  1133. break
  1134. _2:
  1135. sendStmt = nil
  1136. // *ebnf.Name RecvStmt ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  1137. if recvStmt = p.recvStmt(); recvStmt == nil {
  1138. goto _3
  1139. }
  1140. break
  1141. _3:
  1142. recvStmt = nil
  1143. p.back(ix)
  1144. goto _0
  1145. default:
  1146. p.back(ix)
  1147. goto _0
  1148. }
  1149. }
  1150. break
  1151. _0:
  1152. caseTok = Token{}
  1153. return nil
  1154. case DEFAULT: // 1
  1155. // *ebnf.Token "default" ctx [DEFAULT]
  1156. defaultTok = p.expect(DEFAULT)
  1157. default:
  1158. return nil
  1159. }
  1160. return &CommCaseNode{
  1161. CASE: caseTok,
  1162. SendStmt: sendStmt,
  1163. RecvStmt: recvStmt,
  1164. DEFAULT: defaultTok,
  1165. }
  1166. }
  1167. // CommClauseNode represents the production
  1168. //
  1169. // CommClause = CommCase ":" StatementList .
  1170. type CommClauseNode struct {
  1171. CommCase *CommCaseNode
  1172. COLON Token
  1173. StatementList *StatementListNode
  1174. }
  1175. // Source implements Node.
  1176. func (n *CommClauseNode) Source(full bool) string { return nodeSource(n, full) }
  1177. // Position implements Node.
  1178. func (n *CommClauseNode) Position() (r token.Position) {
  1179. if n == nil {
  1180. return r
  1181. }
  1182. return n.CommCase.Position()
  1183. }
  1184. func (p *parser) commClause() *CommClauseNode {
  1185. var (
  1186. ok bool
  1187. commCase *CommCaseNode
  1188. colonTok Token
  1189. statementList *StatementListNode
  1190. )
  1191. // ebnf.Sequence CommCase ":" StatementList ctx [CASE, DEFAULT]
  1192. {
  1193. p.openScope()
  1194. defer p.closeScope()
  1195. ix := p.ix
  1196. // *ebnf.Name CommCase ctx [CASE, DEFAULT]
  1197. if commCase = p.commCase(); commCase == nil {
  1198. p.back(ix)
  1199. return nil
  1200. }
  1201. // *ebnf.Token ":" ctx []
  1202. if colonTok, ok = p.accept(COLON); !ok {
  1203. p.back(ix)
  1204. return nil
  1205. }
  1206. // *ebnf.Name StatementList ctx []
  1207. switch p.c() {
  1208. case ADD, AND, ARROW, BREAK, CHAN, CHAR, CONST, CONTINUE, DEFER, FALLTHROUGH, FLOAT, FOR, FUNC, GO, GOTO, IDENT, IF, IMAG, INT, INTERFACE, LBRACE, LBRACK, LPAREN, MAP, MUL, NOT, RETURN, SELECT, SEMICOLON, STRING, STRUCT, SUB, SWITCH, TYPE, VAR, XOR /* ε */ :
  1209. if statementList = p.statementList(); statementList == nil {
  1210. p.back(ix)
  1211. return nil
  1212. }
  1213. }
  1214. }
  1215. return &CommClauseNode{
  1216. CommCase: commCase,
  1217. COLON: colonTok,
  1218. StatementList: statementList,
  1219. }
  1220. }
  1221. // CompositeLitNode represents the production
  1222. //
  1223. // CompositeLit = LiteralType LiteralValue .
  1224. type CompositeLitNode struct {
  1225. LiteralType Node
  1226. LiteralValue *LiteralValueNode
  1227. typeCache
  1228. }
  1229. // Source implements Node.
  1230. func (n *CompositeLitNode) Source(full bool) string { return nodeSource(n, full) }
  1231. // Position implements Node.
  1232. func (n *CompositeLitNode) Position() (r token.Position) {
  1233. if n == nil {
  1234. return r
  1235. }
  1236. return n.LiteralType.Position()
  1237. }
  1238. func (p *parser) compositeLit() *CompositeLitNode {
  1239. var (
  1240. literalType Node
  1241. literalValue *LiteralValueNode
  1242. )
  1243. // ebnf.Sequence LiteralType LiteralValue ctx [LBRACK, MAP, STRUCT]
  1244. {
  1245. ix := p.ix
  1246. // *ebnf.Name LiteralType ctx [LBRACK, MAP, STRUCT]
  1247. if literalType = p.literalType(); literalType == nil {
  1248. p.back(ix)
  1249. return nil
  1250. }
  1251. // *ebnf.Name LiteralValue ctx []
  1252. switch p.c() {
  1253. case LBRACE:
  1254. if literalValue = p.literalValue(); literalValue == nil {
  1255. p.back(ix)
  1256. return nil
  1257. }
  1258. default:
  1259. p.back(ix)
  1260. return nil
  1261. }
  1262. }
  1263. return &CompositeLitNode{
  1264. LiteralType: literalType,
  1265. LiteralValue: literalValue,
  1266. }
  1267. }
  1268. func (p *parser) condition(preBlock bool) Expression {
  1269. // *ebnf.Name Expression ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  1270. return p.expression(preBlock)
  1271. }
  1272. // ConstSpecListNode represents the production
  1273. //
  1274. // ConstSpecListNode = { ConstSpec ";" } .
  1275. type ConstSpecListNode struct {
  1276. ConstSpec Node
  1277. SEMICOLON Token
  1278. List *ConstSpecListNode
  1279. }
  1280. // Source implements Node.
  1281. func (n *ConstSpecListNode) Source(full bool) string { return nodeSource(n, full) }
  1282. // Position implements Node.
  1283. func (n *ConstSpecListNode) Position() (r token.Position) {
  1284. if n == nil {
  1285. return r
  1286. }
  1287. return n.ConstSpec.Position()
  1288. }
  1289. // ConstDeclNode represents the production
  1290. //
  1291. // ConstDecl = "const" ( ConstSpec | "(" { ConstSpec ";" } ")" ) .
  1292. type ConstDeclNode struct {
  1293. CONST Token
  1294. LPAREN Token
  1295. ConstSpec Node
  1296. RPAREN Token
  1297. }
  1298. // Source implements Node.
  1299. func (n *ConstDeclNode) Source(full bool) string { return nodeSource(n, full) }
  1300. // Position implements Node.
  1301. func (n *ConstDeclNode) Position() (r token.Position) {
  1302. if n == nil {
  1303. return r
  1304. }
  1305. return n.CONST.Position()
  1306. }
  1307. func (p *parser) constDecl() *ConstDeclNode {
  1308. var (
  1309. ok bool
  1310. constTok Token
  1311. constSpec Node
  1312. lparenTok Token
  1313. list *ConstSpecListNode
  1314. rparenTok Token
  1315. iota int64
  1316. )
  1317. // ebnf.Sequence "const" ( ConstSpec | "(" { ConstSpec ";" } [ ConstSpec ] ")" ) ctx [CONST]
  1318. {
  1319. switch p.peek(1) {
  1320. case IDENT, LPAREN:
  1321. default:
  1322. return nil
  1323. }
  1324. ix := p.ix
  1325. // *ebnf.Token "const" ctx [CONST]
  1326. constTok = p.expect(CONST)
  1327. // *ebnf.Group ( ConstSpec | "(" { ConstSpec ";" } [ ConstSpec ] ")" ) ctx [IDENT, LPAREN]
  1328. // ebnf.Alternative ConstSpec | "(" { ConstSpec ";" } [ ConstSpec ] ")" ctx [IDENT, LPAREN]
  1329. switch p.c() {
  1330. case IDENT: // 0
  1331. // *ebnf.Name ConstSpec ctx [IDENT]
  1332. if constSpec = p.constSpec(iota); constSpec == nil {
  1333. goto _0
  1334. }
  1335. list = &ConstSpecListNode{
  1336. ConstSpec: constSpec,
  1337. }
  1338. break
  1339. _0:
  1340. constSpec = nil
  1341. p.back(ix)
  1342. return nil
  1343. case LPAREN: // 1
  1344. // ebnf.Sequence "(" { ConstSpec ";" } [ ConstSpec ] ")" ctx [LPAREN]
  1345. {
  1346. ix := p.ix
  1347. // *ebnf.Token "(" ctx [LPAREN]
  1348. lparenTok = p.expect(LPAREN)
  1349. // *ebnf.Repetition { ConstSpec ";" } ctx []
  1350. var item *ConstSpecListNode
  1351. _4:
  1352. {
  1353. var constSpec Node
  1354. var semicolonTok Token
  1355. switch p.c() {
  1356. case IDENT:
  1357. // ebnf.Sequence ConstSpec ";" ctx [IDENT]
  1358. ix := p.ix
  1359. // *ebnf.Name ConstSpec ctx [IDENT]
  1360. if constSpec = p.constSpec(iota); constSpec == nil {
  1361. p.back(ix)
  1362. goto _5
  1363. }
  1364. if p.c() == RPAREN {
  1365. next := &ConstSpecListNode{
  1366. ConstSpec: constSpec,
  1367. }
  1368. if item != nil {
  1369. item.List = next
  1370. }
  1371. item = next
  1372. if list == nil {
  1373. list = item
  1374. }
  1375. break
  1376. }
  1377. // *ebnf.Token ";" ctx []
  1378. if semicolonTok, ok = p.accept(SEMICOLON); !ok {
  1379. p.back(ix)
  1380. goto _5
  1381. }
  1382. next := &ConstSpecListNode{
  1383. ConstSpec: constSpec,
  1384. SEMICOLON: semicolonTok,
  1385. }
  1386. iota++
  1387. if item != nil {
  1388. item.List = next
  1389. }
  1390. item = next
  1391. if list == nil {
  1392. list = item
  1393. }
  1394. goto _4
  1395. }
  1396. _5:
  1397. }
  1398. if rparenTok, ok = p.accept(RPAREN); !ok {
  1399. p.back(ix)
  1400. goto _2
  1401. }
  1402. }
  1403. break
  1404. _2:
  1405. lparenTok = Token{}
  1406. rparenTok = Token{}
  1407. p.back(ix)
  1408. return nil
  1409. default:
  1410. p.back(ix)
  1411. return nil
  1412. }
  1413. }
  1414. if list != nil && list.List == nil && !list.SEMICOLON.IsValid() {
  1415. return &ConstDeclNode{
  1416. CONST: constTok,
  1417. LPAREN: lparenTok,
  1418. ConstSpec: list.ConstSpec,
  1419. RPAREN: rparenTok,
  1420. }
  1421. }
  1422. return &ConstDeclNode{
  1423. CONST: constTok,
  1424. LPAREN: lparenTok,
  1425. ConstSpec: list,
  1426. RPAREN: rparenTok,
  1427. }
  1428. }
  1429. // ConstSpecNode represents the production
  1430. //
  1431. // ConstSpec = Identifier [ [ Type ] "=" Expression ] .
  1432. type ConstSpecNode struct {
  1433. IDENT Token
  1434. TypeNode Type
  1435. ASSIGN Token
  1436. Expression Expression
  1437. iota int64
  1438. visible
  1439. guard
  1440. }
  1441. // Source implements Node.
  1442. func (n *ConstSpecNode) Source(full bool) string { return nodeSource(n, full) }
  1443. // Position implements Node.
  1444. func (n *ConstSpecNode) Position() (r token.Position) {
  1445. if n == nil {
  1446. return r
  1447. }
  1448. return n.IDENT.Position()
  1449. }
  1450. // ConstSpec2Node represents the production
  1451. //
  1452. // ConstSpec = IdentifierList [ [ Type ] "=" ExpressionList ] .
  1453. type ConstSpec2Node struct {
  1454. IdentifierList *IdentifierListNode
  1455. TypeNode Type
  1456. ASSIGN Token
  1457. ExpressionList *ExpressionListNode
  1458. iota int64
  1459. visible
  1460. }
  1461. // Source implements Node.
  1462. func (n *ConstSpec2Node) Source(full bool) string { return nodeSource(n, full) }
  1463. // Position implements Node.
  1464. func (n *ConstSpec2Node) Position() (r token.Position) {
  1465. if n == nil {
  1466. return r
  1467. }
  1468. return n.IdentifierList.Position()
  1469. }
  1470. func (p *parser) constSpec(iota int64) Node {
  1471. var (
  1472. ok bool
  1473. identifierList *IdentifierListNode
  1474. typeNode Type
  1475. assignTok Token
  1476. expressionList *ExpressionListNode
  1477. )
  1478. // ebnf.Sequence IdentifierList [ [ Type ] "=" ExpressionList ] ctx [IDENT]
  1479. {
  1480. ix := p.ix
  1481. // *ebnf.Name IdentifierList ctx [IDENT]
  1482. if identifierList = p.identifierList(); identifierList == nil {
  1483. p.back(ix)
  1484. return nil
  1485. }
  1486. // *ebnf.Option [ [ Type ] "=" ExpressionList ] ctx []
  1487. switch p.c() {
  1488. case ARROW, ASSIGN, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT:
  1489. // ebnf.Sequence [ Type ] "=" ExpressionList ctx [ARROW, ASSIGN, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT]
  1490. {
  1491. ix := p.ix
  1492. // *ebnf.Option [ Type ] ctx [ARROW, ASSIGN, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT]
  1493. switch p.c() {
  1494. case ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT:
  1495. // *ebnf.Name Type ctx [ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT]
  1496. if typeNode = p.type1(); typeNode == nil {
  1497. goto _2
  1498. }
  1499. }
  1500. goto _3
  1501. _2:
  1502. typeNode = nil
  1503. _3:
  1504. // *ebnf.Token "=" ctx []
  1505. if assignTok, ok = p.accept(ASSIGN); !ok {
  1506. p.back(ix)
  1507. goto _0
  1508. }
  1509. // *ebnf.Name ExpressionList ctx []
  1510. switch p.c() {
  1511. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  1512. if expressionList = p.expressionList(false); expressionList == nil {
  1513. p.back(ix)
  1514. goto _0
  1515. }
  1516. default:
  1517. p.back(ix)
  1518. goto _0
  1519. }
  1520. }
  1521. }
  1522. goto _1
  1523. _0:
  1524. assignTok = Token{}
  1525. expressionList = nil
  1526. typeNode = nil
  1527. _1:
  1528. }
  1529. sc := p.sc
  1530. visible := int32(p.ix)
  1531. if expressionList.Len() < 2 && identifierList.Len() < 2 {
  1532. r := &ConstSpecNode{
  1533. IDENT: identifierList.first(),
  1534. TypeNode: typeNode,
  1535. ASSIGN: assignTok,
  1536. Expression: expressionList.first(),
  1537. iota: iota,
  1538. }
  1539. ids := identifierList.Len()
  1540. exprs := expressionList.Len()
  1541. if exprs != 0 && ids != exprs {
  1542. p.err(r.ASSIGN.Position(), "different number of identifiers and expressions: %v %v", ids, exprs)
  1543. }
  1544. for l := identifierList; l != nil; l = l.List {
  1545. p.declare(sc, l.IDENT, r, visible, false)
  1546. }
  1547. return r
  1548. }
  1549. r := &ConstSpec2Node{
  1550. IdentifierList: identifierList,
  1551. TypeNode: typeNode,
  1552. ASSIGN: assignTok,
  1553. ExpressionList: expressionList,
  1554. iota: iota,
  1555. }
  1556. ids := r.IdentifierList.Len()
  1557. exprs := r.ExpressionList.Len()
  1558. if exprs != 0 && ids != exprs {
  1559. p.err(r.ASSIGN.Position(), "different number of identifiers and expressions: %v %v", ids, exprs)
  1560. }
  1561. for l := r.IdentifierList; l != nil; l = l.List {
  1562. p.declare(sc, l.IDENT, r, visible, false)
  1563. }
  1564. return r
  1565. }
  1566. // ContinueStmtNode represents the production
  1567. //
  1568. // ContinueStmt = "continue" [ Label ] .
  1569. type ContinueStmtNode struct {
  1570. CONTINUE Token
  1571. Label *LabelNode
  1572. }
  1573. // Source implements Node.
  1574. func (n *ContinueStmtNode) Source(full bool) string { return nodeSource(n, full) }
  1575. // Position implements Node.
  1576. func (n *ContinueStmtNode) Position() (r token.Position) {
  1577. if n == nil {
  1578. return r
  1579. }
  1580. return n.CONTINUE.Position()
  1581. }
  1582. func (p *parser) continueStmt() *ContinueStmtNode {
  1583. var (
  1584. continueTok Token
  1585. label *LabelNode
  1586. )
  1587. // ebnf.Sequence "continue" [ Label ] ctx [CONTINUE]
  1588. {
  1589. // *ebnf.Token "continue" ctx [CONTINUE]
  1590. continueTok = p.expect(CONTINUE)
  1591. // *ebnf.Option [ Label ] ctx []
  1592. switch p.c() {
  1593. case IDENT:
  1594. // *ebnf.Name Label ctx [IDENT]
  1595. if label = p.label(); label == nil {
  1596. goto _0
  1597. }
  1598. }
  1599. goto _1
  1600. _0:
  1601. label = nil
  1602. _1:
  1603. }
  1604. return &ContinueStmtNode{
  1605. CONTINUE: continueTok,
  1606. Label: label,
  1607. }
  1608. }
  1609. // ConversionNode represents the production
  1610. //
  1611. // Conversion = Type "(" Expression [ "," ] ")" .
  1612. type ConversionNode struct {
  1613. TypeNode Type
  1614. LPAREN Token
  1615. Expression Expression
  1616. COMMA Token
  1617. RPAREN Token
  1618. valueCache
  1619. }
  1620. // Source implements Node.
  1621. func (n *ConversionNode) Source(full bool) string { return nodeSource(n, full) }
  1622. // Position implements Node.
  1623. func (n *ConversionNode) Position() (r token.Position) {
  1624. if n == nil {
  1625. return r
  1626. }
  1627. return n.TypeNode.Position()
  1628. }
  1629. func (p *parser) conversion() *ConversionNode {
  1630. var (
  1631. ok bool
  1632. typeNode Type
  1633. lparenTok Token
  1634. expression Expression
  1635. commaTok Token
  1636. rparenTok Token
  1637. )
  1638. // ebnf.Sequence Type "(" Expression [ "," ] ")" ctx [ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT]
  1639. {
  1640. ix := p.ix
  1641. // *ebnf.Name Type ctx [ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT]
  1642. if typeNode = p.type1(); typeNode == nil {
  1643. p.back(ix)
  1644. return nil
  1645. }
  1646. // *ebnf.Token "(" ctx []
  1647. if lparenTok, ok = p.accept(LPAREN); !ok {
  1648. p.back(ix)
  1649. return nil
  1650. }
  1651. // *ebnf.Name Expression ctx []
  1652. switch p.c() {
  1653. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  1654. if expression = p.expression(false); expression == nil {
  1655. p.back(ix)
  1656. return nil
  1657. }
  1658. default:
  1659. p.back(ix)
  1660. return nil
  1661. }
  1662. // *ebnf.Option [ "," ] ctx []
  1663. switch p.c() {
  1664. case COMMA:
  1665. // *ebnf.Token "," ctx [COMMA]
  1666. commaTok = p.expect(COMMA)
  1667. }
  1668. // *ebnf.Token ")" ctx []
  1669. if rparenTok, ok = p.accept(RPAREN); !ok {
  1670. p.back(ix)
  1671. return nil
  1672. }
  1673. }
  1674. return &ConversionNode{
  1675. TypeNode: typeNode,
  1676. LPAREN: lparenTok,
  1677. Expression: expression,
  1678. COMMA: commaTok,
  1679. RPAREN: rparenTok,
  1680. }
  1681. }
  1682. func (p *parser) declaration() Node {
  1683. // ebnf.Alternative ConstDecl | TypeDecl | VarDecl ctx [CONST, TYPE, VAR]
  1684. switch p.c() {
  1685. case CONST: // 0
  1686. // *ebnf.Name ConstDecl ctx [CONST]
  1687. return p.constDecl()
  1688. case TYPE: // 1
  1689. // *ebnf.Name TypeDecl ctx [TYPE]
  1690. return p.typeDecl()
  1691. case VAR: // 2
  1692. // *ebnf.Name VarDecl ctx [VAR]
  1693. return p.varDecl()
  1694. default:
  1695. return nil
  1696. }
  1697. }
  1698. // DeferStmtNode represents the production
  1699. //
  1700. // DeferStmt = "defer" Expression .
  1701. type DeferStmtNode struct {
  1702. DEFER Token
  1703. Expression Expression
  1704. }
  1705. // Source implements Node.
  1706. func (n *DeferStmtNode) Source(full bool) string { return nodeSource(n, full) }
  1707. // Position implements Node.
  1708. func (n *DeferStmtNode) Position() (r token.Position) {
  1709. if n == nil {
  1710. return r
  1711. }
  1712. return n.DEFER.Position()
  1713. }
  1714. func (p *parser) deferStmt() *DeferStmtNode {
  1715. var (
  1716. deferTok Token
  1717. expression Expression
  1718. )
  1719. // ebnf.Sequence "defer" Expression ctx [DEFER]
  1720. {
  1721. switch p.peek(1) {
  1722. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  1723. default:
  1724. return nil
  1725. }
  1726. ix := p.ix
  1727. // *ebnf.Token "defer" ctx [DEFER]
  1728. deferTok = p.expect(DEFER)
  1729. // *ebnf.Name Expression ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  1730. if expression = p.expression(false); expression == nil {
  1731. p.back(ix)
  1732. return nil
  1733. }
  1734. }
  1735. return &DeferStmtNode{
  1736. DEFER: deferTok,
  1737. Expression: expression,
  1738. }
  1739. }
  1740. func (p *parser) element() Expression {
  1741. var (
  1742. expression Expression
  1743. literalValue *LiteralValueNode
  1744. )
  1745. // ebnf.Alternative Expression | LiteralValue ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  1746. switch p.c() {
  1747. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR: // 0
  1748. // *ebnf.Name Expression ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  1749. if expression = p.expression(false); expression != nil {
  1750. return expression
  1751. }
  1752. case LBRACE: // 1
  1753. // *ebnf.Name LiteralValue ctx [LBRACE]
  1754. if literalValue = p.literalValue(); literalValue != nil {
  1755. return literalValue
  1756. }
  1757. }
  1758. return nil
  1759. }
  1760. // EmbeddedFieldNode represents the production
  1761. //
  1762. // EmbeddedField = [ "*" ] TypeName [ TypeArgs ] .
  1763. type EmbeddedFieldNode struct {
  1764. MUL Token
  1765. TypeName *TypeNameNode
  1766. TypeArgs *TypeArgsNode
  1767. }
  1768. // Source implements Node.
  1769. func (n *EmbeddedFieldNode) Source(full bool) string { return nodeSource(n, full) }
  1770. // Position implements Node.
  1771. func (n *EmbeddedFieldNode) Position() (r token.Position) {
  1772. if n == nil {
  1773. return r
  1774. }
  1775. panic("TODO")
  1776. }
  1777. func (p *parser) embeddedField() *EmbeddedFieldNode {
  1778. var (
  1779. mulTok Token
  1780. typeName *TypeNameNode
  1781. typeArgs *TypeArgsNode
  1782. )
  1783. // ebnf.Sequence [ "*" ] TypeName [ TypeArgs ] ctx [IDENT, MUL]
  1784. {
  1785. ix := p.ix
  1786. // *ebnf.Option [ "*" ] ctx [IDENT, MUL]
  1787. switch p.c() {
  1788. case MUL:
  1789. // *ebnf.Token "*" ctx [MUL]
  1790. mulTok = p.expect(MUL)
  1791. }
  1792. // *ebnf.Name TypeName ctx []
  1793. switch p.c() {
  1794. case IDENT:
  1795. if typeName = p.typeName(); typeName == nil {
  1796. p.back(ix)
  1797. return nil
  1798. }
  1799. default:
  1800. p.back(ix)
  1801. return nil
  1802. }
  1803. // *ebnf.Option [ TypeArgs ] ctx []
  1804. switch p.c() {
  1805. case LBRACK:
  1806. // *ebnf.Name TypeArgs ctx [LBRACK]
  1807. if typeArgs = p.typeArgs(); typeArgs == nil {
  1808. goto _2
  1809. }
  1810. }
  1811. goto _3
  1812. _2:
  1813. typeArgs = nil
  1814. _3:
  1815. }
  1816. return &EmbeddedFieldNode{
  1817. MUL: mulTok,
  1818. TypeName: typeName,
  1819. TypeArgs: typeArgs,
  1820. }
  1821. }
  1822. // EmptyStmtNode represents the production
  1823. //
  1824. // EmptyStmt = .
  1825. type EmptyStmtNode struct {
  1826. }
  1827. // Source implements Node.
  1828. func (n *EmptyStmtNode) Source(full bool) string { return nodeSource(n, full) }
  1829. // Position implements Node.
  1830. func (n *EmptyStmtNode) Position() (r token.Position) {
  1831. if n == nil {
  1832. return r
  1833. }
  1834. panic("TODO")
  1835. }
  1836. func (p *parser) emptyStmt() *EmptyStmtNode {
  1837. return &EmptyStmtNode{}
  1838. }
  1839. // ExprCaseClauseListNode represents the production
  1840. //
  1841. // ExprCaseClause = ExprSwitchCase ":" StatementList .
  1842. type ExprCaseClauseListNode struct {
  1843. ExprSwitchCase Node
  1844. COLON Token
  1845. StatementList *StatementListNode
  1846. List *ExprCaseClauseListNode
  1847. }
  1848. // Source implements Node.
  1849. func (n *ExprCaseClauseListNode) Source(full bool) string { return nodeSource(n, full) }
  1850. // Position implements Node.
  1851. func (n *ExprCaseClauseListNode) Position() (r token.Position) {
  1852. if n == nil {
  1853. return r
  1854. }
  1855. return n.ExprSwitchCase.Position()
  1856. }
  1857. func (p *parser) exprCaseClause() *ExprCaseClauseListNode {
  1858. var (
  1859. ok bool
  1860. exprSwitchCase Node
  1861. colonTok Token
  1862. statementList *StatementListNode
  1863. )
  1864. // ebnf.Sequence ExprSwitchCase ":" StatementList ctx [CASE, DEFAULT]
  1865. {
  1866. p.openScope()
  1867. defer p.closeScope()
  1868. ix := p.ix
  1869. // *ebnf.Name ExprSwitchCase ctx [CASE, DEFAULT]
  1870. if exprSwitchCase = p.exprSwitchCase(); exprSwitchCase == nil {
  1871. p.back(ix)
  1872. return nil
  1873. }
  1874. // *ebnf.Token ":" ctx []
  1875. if colonTok, ok = p.accept(COLON); !ok {
  1876. p.back(ix)
  1877. return nil
  1878. }
  1879. // *ebnf.Name StatementList ctx []
  1880. switch p.c() {
  1881. case ADD, AND, ARROW, BREAK, CHAN, CHAR, CONST, CONTINUE, DEFER, FALLTHROUGH, FLOAT, FOR, FUNC, GO, GOTO, IDENT, IF, IMAG, INT, INTERFACE, LBRACE, LBRACK, LPAREN, MAP, MUL, NOT, RETURN, SELECT, SEMICOLON, STRING, STRUCT, SUB, SWITCH, TYPE, VAR, XOR /* ε */ :
  1882. if statementList = p.statementList(); statementList == nil {
  1883. p.back(ix)
  1884. return nil
  1885. }
  1886. }
  1887. }
  1888. return &ExprCaseClauseListNode{
  1889. ExprSwitchCase: exprSwitchCase,
  1890. COLON: colonTok,
  1891. StatementList: statementList,
  1892. }
  1893. }
  1894. // ExprSwitchCaseNode represents the production
  1895. //
  1896. // ExprSwitchCase = "case" ExpressionList | "default" .
  1897. type ExprSwitchCaseNode struct {
  1898. CASE Token
  1899. Expression Expression
  1900. DEFAULT Token
  1901. }
  1902. // Source implements Node.
  1903. func (n *ExprSwitchCaseNode) Source(full bool) string { return nodeSource(n, full) }
  1904. // Position implements Node.
  1905. func (n *ExprSwitchCaseNode) Position() (r token.Position) {
  1906. if n == nil {
  1907. return r
  1908. }
  1909. return n.CASE.Position()
  1910. }
  1911. // ExprSwitchCase2Node represents the production
  1912. //
  1913. // ExprSwitchCase = "case" ExpressionList | "default" .
  1914. type ExprSwitchCase2Node struct {
  1915. CASE Token
  1916. ExpressionList *ExpressionListNode
  1917. DEFAULT Token
  1918. }
  1919. // Source implements Node.
  1920. func (n *ExprSwitchCase2Node) Source(full bool) string { return nodeSource(n, full) }
  1921. // Position implements Node.
  1922. func (n *ExprSwitchCase2Node) Position() (r token.Position) {
  1923. if n == nil {
  1924. return r
  1925. }
  1926. return n.CASE.Position()
  1927. }
  1928. func (p *parser) exprSwitchCase() Node {
  1929. var (
  1930. caseTok Token
  1931. expressionList *ExpressionListNode
  1932. defaultTok Token
  1933. )
  1934. // ebnf.Alternative "case" ExpressionList | "default" ctx [CASE, DEFAULT]
  1935. switch p.c() {
  1936. case CASE: // 0
  1937. // ebnf.Sequence "case" ExpressionList ctx [CASE]
  1938. {
  1939. switch p.peek(1) {
  1940. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  1941. default:
  1942. goto _0
  1943. }
  1944. ix := p.ix
  1945. // *ebnf.Token "case" ctx [CASE]
  1946. caseTok = p.expect(CASE)
  1947. // *ebnf.Name ExpressionList ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  1948. if expressionList = p.expressionList(false); expressionList == nil {
  1949. p.back(ix)
  1950. goto _0
  1951. }
  1952. }
  1953. break
  1954. _0:
  1955. caseTok = Token{}
  1956. expressionList = nil
  1957. return nil
  1958. case DEFAULT: // 1
  1959. // *ebnf.Token "default" ctx [DEFAULT]
  1960. defaultTok = p.expect(DEFAULT)
  1961. default:
  1962. return nil
  1963. }
  1964. if expressionList.Len() == 1 {
  1965. return &ExprSwitchCaseNode{
  1966. CASE: caseTok,
  1967. Expression: expressionList.first(),
  1968. DEFAULT: defaultTok,
  1969. }
  1970. }
  1971. return &ExprSwitchCase2Node{
  1972. CASE: caseTok,
  1973. ExpressionList: expressionList,
  1974. DEFAULT: defaultTok,
  1975. }
  1976. }
  1977. // ExprSwitchStmtNode represents the production
  1978. //
  1979. // ExprSwitchStmt = "switch" [ Expression ] "{" { ExprCaseClause } "}" | "switch" SimpleStmt ";" [ Expression ] "{" { ExprCaseClause } "}" .
  1980. type ExprSwitchStmtNode struct {
  1981. SWITCH Token
  1982. Expression Expression
  1983. LBRACE Token
  1984. ExprCaseClauseList *ExprCaseClauseListNode
  1985. RBRACE Token
  1986. SimpleStmt Node
  1987. SEMICOLON Token
  1988. }
  1989. // Source implements Node.
  1990. func (n *ExprSwitchStmtNode) Source(full bool) string { return nodeSource(n, full) }
  1991. // Position implements Node.
  1992. func (n *ExprSwitchStmtNode) Position() (r token.Position) {
  1993. if n == nil {
  1994. return r
  1995. }
  1996. panic("TODO")
  1997. }
  1998. func (p *parser) exprSwitchStmt() *ExprSwitchStmtNode {
  1999. var (
  2000. ok bool
  2001. switchTok Token
  2002. expression Expression
  2003. lbraceTok Token
  2004. list *ExprCaseClauseListNode
  2005. rbraceTok Token
  2006. simpleStmt Node
  2007. semicolonTok Token
  2008. )
  2009. // ebnf.Alternative "switch" [ Expression ] "{" { ExprCaseClause } "}" | "switch" SimpleStmt ";" [ Expression ] "{" { ExprCaseClause } "}" ctx [SWITCH]
  2010. switch p.c() {
  2011. case SWITCH: // 0 1
  2012. // ebnf.Sequence "switch" [ Expression ] "{" { ExprCaseClause } "}" ctx [SWITCH]
  2013. {
  2014. ix := p.ix
  2015. // *ebnf.Token "switch" ctx [SWITCH]
  2016. switchTok = p.expect(SWITCH)
  2017. // *ebnf.Option [ Expression ] ctx []
  2018. switch p.c() {
  2019. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  2020. // *ebnf.Name Expression ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  2021. if expression = p.expression(true); expression == nil {
  2022. goto _1
  2023. }
  2024. }
  2025. goto _2
  2026. _1:
  2027. expression = nil
  2028. _2:
  2029. // *ebnf.Token "{" ctx []
  2030. if lbraceTok, ok = p.accept(LBRACE); !ok {
  2031. p.back(ix)
  2032. goto _0
  2033. }
  2034. // *ebnf.Repetition { ExprCaseClause } ctx []
  2035. var item *ExprCaseClauseListNode
  2036. _3:
  2037. {
  2038. var exprCaseClause *ExprCaseClauseListNode
  2039. switch p.c() {
  2040. case CASE, DEFAULT:
  2041. // *ebnf.Name ExprCaseClause ctx [CASE, DEFAULT]
  2042. if exprCaseClause = p.exprCaseClause(); exprCaseClause == nil {
  2043. goto _4
  2044. }
  2045. if item != nil {
  2046. item.List = exprCaseClause
  2047. }
  2048. item = exprCaseClause
  2049. if list == nil {
  2050. list = item
  2051. }
  2052. goto _3
  2053. }
  2054. _4:
  2055. }
  2056. // *ebnf.Token "}" ctx []
  2057. if rbraceTok, ok = p.accept(RBRACE); !ok {
  2058. p.back(ix)
  2059. goto _0
  2060. }
  2061. }
  2062. break
  2063. _0:
  2064. expression = nil
  2065. lbraceTok = Token{}
  2066. rbraceTok = Token{}
  2067. switchTok = Token{}
  2068. // ebnf.Sequence "switch" SimpleStmt ";" [ Expression ] "{" { ExprCaseClause } "}" ctx [SWITCH]
  2069. {
  2070. ix := p.ix
  2071. // *ebnf.Token "switch" ctx [SWITCH]
  2072. switchTok = p.expect(SWITCH)
  2073. // *ebnf.Name SimpleStmt ctx []
  2074. switch p.c() {
  2075. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR /* ε */ :
  2076. if simpleStmt = p.simpleStmt(false); simpleStmt == nil {
  2077. p.back(ix)
  2078. goto _5
  2079. }
  2080. }
  2081. // *ebnf.Token ";" ctx []
  2082. if semicolonTok, ok = p.accept(SEMICOLON); !ok {
  2083. p.back(ix)
  2084. goto _5
  2085. }
  2086. // *ebnf.Option [ Expression ] ctx []
  2087. switch p.c() {
  2088. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  2089. // *ebnf.Name Expression ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  2090. if expression = p.expression(true); expression == nil {
  2091. goto _6
  2092. }
  2093. }
  2094. goto _7
  2095. _6:
  2096. expression = nil
  2097. _7:
  2098. // *ebnf.Token "{" ctx []
  2099. if lbraceTok, ok = p.accept(LBRACE); !ok {
  2100. p.back(ix)
  2101. goto _5
  2102. }
  2103. // *ebnf.Repetition { ExprCaseClause } ctx []
  2104. var item *ExprCaseClauseListNode
  2105. _8:
  2106. {
  2107. var exprCaseClause *ExprCaseClauseListNode
  2108. switch p.c() {
  2109. case CASE, DEFAULT:
  2110. // *ebnf.Name ExprCaseClause ctx [CASE, DEFAULT]
  2111. if exprCaseClause = p.exprCaseClause(); exprCaseClause == nil {
  2112. goto _9
  2113. }
  2114. if item != nil {
  2115. item.List = exprCaseClause
  2116. }
  2117. item = exprCaseClause
  2118. if list == nil {
  2119. list = item
  2120. }
  2121. goto _8
  2122. }
  2123. _9:
  2124. }
  2125. // *ebnf.Token "}" ctx []
  2126. if rbraceTok, ok = p.accept(RBRACE); !ok {
  2127. p.back(ix)
  2128. goto _5
  2129. }
  2130. }
  2131. break
  2132. _5:
  2133. expression = nil
  2134. lbraceTok = Token{}
  2135. rbraceTok = Token{}
  2136. semicolonTok = Token{}
  2137. simpleStmt = nil
  2138. switchTok = Token{}
  2139. return nil
  2140. default:
  2141. return nil
  2142. }
  2143. return &ExprSwitchStmtNode{
  2144. SWITCH: switchTok,
  2145. Expression: expression,
  2146. LBRACE: lbraceTok,
  2147. ExprCaseClauseList: list,
  2148. RBRACE: rbraceTok,
  2149. SimpleStmt: simpleStmt,
  2150. SEMICOLON: semicolonTok,
  2151. }
  2152. }
  2153. func (p *parser) expression(preBlock bool) (r Expression) {
  2154. var logicalAndExpression Expression
  2155. // ebnf.Sequence LogicalAndExpression { "||" LogicalAndExpression } ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  2156. {
  2157. ix := p.ix
  2158. // *ebnf.Name LogicalAndExpression ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  2159. if logicalAndExpression = p.logicalAndExpression(preBlock); logicalAndExpression == nil {
  2160. p.back(ix)
  2161. return nil
  2162. }
  2163. r = logicalAndExpression
  2164. // *ebnf.Repetition { "||" LogicalAndExpression } ctx []
  2165. _0:
  2166. {
  2167. var lorTok Token
  2168. var logicalAndExpression Expression
  2169. switch p.c() {
  2170. case LOR:
  2171. // ebnf.Sequence "||" LogicalAndExpression ctx [LOR]
  2172. switch p.peek(1) {
  2173. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  2174. default:
  2175. goto _1
  2176. }
  2177. ix := p.ix
  2178. // *ebnf.Token "||" ctx [LOR]
  2179. lorTok = p.expect(LOR)
  2180. // *ebnf.Name LogicalAndExpression ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  2181. if logicalAndExpression = p.logicalAndExpression(preBlock); logicalAndExpression == nil {
  2182. p.back(ix)
  2183. goto _1
  2184. }
  2185. r = &BinaryExpressionNode{LHS: r, Op: lorTok, RHS: logicalAndExpression}
  2186. goto _0
  2187. }
  2188. _1:
  2189. }
  2190. }
  2191. return r
  2192. }
  2193. // ExpressionListNode represents the production
  2194. //
  2195. // ExpressionList = Expression { "," Expression } .
  2196. type ExpressionListNode struct {
  2197. COMMA Token
  2198. Expression Expression
  2199. List *ExpressionListNode
  2200. }
  2201. func (n *ExpressionListNode) first() Expression {
  2202. if n == nil {
  2203. return nil
  2204. }
  2205. return n.Expression
  2206. }
  2207. // Len reports the number of items in n.
  2208. func (n *ExpressionListNode) Len() (r int) {
  2209. for ; n != nil; n = n.List {
  2210. r++
  2211. }
  2212. return r
  2213. }
  2214. // Source implements Node.
  2215. func (n *ExpressionListNode) Source(full bool) string { return nodeSource(n, full) }
  2216. // Position implements Node.
  2217. func (n *ExpressionListNode) Position() (r token.Position) {
  2218. if n == nil {
  2219. return r
  2220. }
  2221. if n.COMMA.IsValid() {
  2222. return n.COMMA.Position()
  2223. }
  2224. return n.Expression.Position()
  2225. }
  2226. func (p *parser) expressionList(preBlock bool) *ExpressionListNode {
  2227. var (
  2228. expression Expression
  2229. expressionList, last *ExpressionListNode
  2230. )
  2231. // ebnf.Sequence Expression { "," Expression } ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  2232. {
  2233. ix := p.ix
  2234. // *ebnf.Name Expression ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  2235. if expression = p.expression(preBlock); expression == nil {
  2236. p.back(ix)
  2237. return nil
  2238. }
  2239. expressionList = &ExpressionListNode{
  2240. Expression: expression,
  2241. }
  2242. last = expressionList
  2243. // *ebnf.Repetition { "," Expression } ctx []
  2244. _0:
  2245. {
  2246. var commaTok Token
  2247. switch p.c() {
  2248. case COMMA:
  2249. // ebnf.Sequence "," Expression ctx [COMMA]
  2250. switch p.peek(1) {
  2251. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  2252. default:
  2253. goto _1
  2254. }
  2255. ix := p.ix
  2256. // *ebnf.Token "," ctx [COMMA]
  2257. commaTok = p.expect(COMMA)
  2258. // *ebnf.Name Expression ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  2259. if expression = p.expression(preBlock); expression == nil {
  2260. p.back(ix)
  2261. goto _1
  2262. }
  2263. next := &ExpressionListNode{
  2264. COMMA: commaTok,
  2265. Expression: expression,
  2266. }
  2267. last.List = next
  2268. last = next
  2269. goto _0
  2270. }
  2271. _1:
  2272. }
  2273. }
  2274. return expressionList
  2275. }
  2276. // FallthroughStmtNode represents the production
  2277. //
  2278. // FallthroughStmt = "fallthrough" .
  2279. type FallthroughStmtNode struct {
  2280. FALLTHROUGH Token
  2281. }
  2282. // Source implements Node.
  2283. func (n *FallthroughStmtNode) Source(full bool) string { return nodeSource(n, full) }
  2284. // Position implements Node.
  2285. func (n *FallthroughStmtNode) Position() (r token.Position) {
  2286. if n == nil {
  2287. return r
  2288. }
  2289. panic("TODO")
  2290. }
  2291. func (p *parser) fallthroughStmt() *FallthroughStmtNode {
  2292. var (
  2293. fallthroughTok Token
  2294. )
  2295. // *ebnf.Token "fallthrough" ctx [FALLTHROUGH]
  2296. fallthroughTok = p.expect(FALLTHROUGH)
  2297. return &FallthroughStmtNode{
  2298. FALLTHROUGH: fallthroughTok,
  2299. }
  2300. }
  2301. // FieldDeclNode represents the production
  2302. //
  2303. // FieldDecl = ( IdentifierList Type | EmbeddedField ) [ Tag ] .
  2304. type FieldDeclNode struct {
  2305. IdentifierList *IdentifierListNode
  2306. TypeNode Type
  2307. EmbeddedField *EmbeddedFieldNode
  2308. Tag *TagNode
  2309. }
  2310. // Source implements Node.
  2311. func (n *FieldDeclNode) Source(full bool) string { return nodeSource(n, full) }
  2312. // Position implements Node.
  2313. func (n *FieldDeclNode) Position() (r token.Position) {
  2314. if n == nil {
  2315. return r
  2316. }
  2317. if n.IdentifierList != nil {
  2318. return n.IdentifierList.Position()
  2319. }
  2320. return n.EmbeddedField.Position()
  2321. }
  2322. func (p *parser) fieldDecl() *FieldDeclNode {
  2323. var (
  2324. identifierList *IdentifierListNode
  2325. typeNode Type
  2326. embeddedField *EmbeddedFieldNode
  2327. tag *TagNode
  2328. )
  2329. // ebnf.Sequence ( IdentifierList Type | EmbeddedField ) [ Tag ] ctx [IDENT, MUL]
  2330. {
  2331. ix := p.ix
  2332. // *ebnf.Group ( IdentifierList Type | EmbeddedField ) ctx [IDENT, MUL]
  2333. // ebnf.Alternative IdentifierList Type | EmbeddedField ctx [IDENT, MUL]
  2334. switch p.c() {
  2335. case IDENT: // 0 1
  2336. // ebnf.Sequence IdentifierList Type ctx [IDENT]
  2337. {
  2338. ix := p.ix
  2339. // *ebnf.Name IdentifierList ctx [IDENT]
  2340. if identifierList = p.identifierList(); identifierList == nil {
  2341. p.back(ix)
  2342. goto _0
  2343. }
  2344. // *ebnf.Name Type ctx []
  2345. switch p.c() {
  2346. case ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT:
  2347. if typeNode = p.type1(); typeNode == nil {
  2348. p.back(ix)
  2349. goto _0
  2350. }
  2351. default:
  2352. p.back(ix)
  2353. goto _0
  2354. }
  2355. }
  2356. break
  2357. _0:
  2358. identifierList = nil
  2359. typeNode = nil
  2360. // *ebnf.Name EmbeddedField ctx [IDENT]
  2361. if embeddedField = p.embeddedField(); embeddedField == nil {
  2362. goto _1
  2363. }
  2364. break
  2365. _1:
  2366. embeddedField = nil
  2367. p.back(ix)
  2368. return nil
  2369. case MUL: // 1
  2370. // *ebnf.Name EmbeddedField ctx [MUL]
  2371. if embeddedField = p.embeddedField(); embeddedField == nil {
  2372. goto _2
  2373. }
  2374. break
  2375. _2:
  2376. embeddedField = nil
  2377. p.back(ix)
  2378. return nil
  2379. default:
  2380. p.back(ix)
  2381. return nil
  2382. }
  2383. // *ebnf.Option [ Tag ] ctx []
  2384. switch p.c() {
  2385. case STRING:
  2386. // *ebnf.Name Tag ctx [STRING]
  2387. if tag = p.tag(); tag == nil {
  2388. goto _4
  2389. }
  2390. }
  2391. goto _5
  2392. _4:
  2393. tag = nil
  2394. _5:
  2395. }
  2396. return &FieldDeclNode{
  2397. IdentifierList: identifierList,
  2398. TypeNode: typeNode,
  2399. EmbeddedField: embeddedField,
  2400. Tag: tag,
  2401. }
  2402. }
  2403. // ForClauseNode represents the production
  2404. //
  2405. // ForClause = [ InitStmt ] ";" [ Condition ] ";" [ PostStmt ] .
  2406. type ForClauseNode struct {
  2407. InitStmt Node
  2408. SEMICOLON Token
  2409. Condition Expression
  2410. SEMICOLON2 Token
  2411. PostStmt Node
  2412. }
  2413. // Source implements Node.
  2414. func (n *ForClauseNode) Source(full bool) string { return nodeSource(n, full) }
  2415. // Position implements Node.
  2416. func (n *ForClauseNode) Position() (r token.Position) {
  2417. if n == nil {
  2418. return r
  2419. }
  2420. panic("TODO")
  2421. }
  2422. func (p *parser) forClause() *ForClauseNode {
  2423. var (
  2424. ok bool
  2425. initStmt Node
  2426. semicolonTok Token
  2427. condition Expression
  2428. semicolon2Tok Token
  2429. postStmt Node
  2430. )
  2431. // ebnf.Sequence [ InitStmt ] ";" [ Condition ] ";" [ PostStmt ] ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, SEMICOLON, STRING, STRUCT, SUB, XOR]
  2432. {
  2433. ix := p.ix
  2434. // *ebnf.Option [ InitStmt ] ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, SEMICOLON, STRING, STRUCT, SUB, XOR]
  2435. switch p.c() {
  2436. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  2437. // *ebnf.Name InitStmt ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  2438. if initStmt = p.initStmt(); initStmt == nil {
  2439. goto _0
  2440. }
  2441. }
  2442. goto _1
  2443. _0:
  2444. initStmt = nil
  2445. _1:
  2446. // *ebnf.Token ";" ctx []
  2447. if semicolonTok, ok = p.accept(SEMICOLON); !ok {
  2448. p.back(ix)
  2449. return nil
  2450. }
  2451. // *ebnf.Option [ Condition ] ctx []
  2452. switch p.c() {
  2453. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  2454. // *ebnf.Name Condition ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  2455. if condition = p.condition(false); condition == nil {
  2456. goto _2
  2457. }
  2458. }
  2459. goto _3
  2460. _2:
  2461. condition = nil
  2462. _3:
  2463. // *ebnf.Token ";" ctx []
  2464. if semicolon2Tok, ok = p.accept(SEMICOLON); !ok {
  2465. p.back(ix)
  2466. return nil
  2467. }
  2468. // *ebnf.Option [ PostStmt ] ctx []
  2469. switch p.c() {
  2470. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR /* ε */ :
  2471. // *ebnf.Name PostStmt ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR /* ε */]
  2472. if postStmt = p.postStmt(); postStmt == nil {
  2473. goto _4
  2474. }
  2475. }
  2476. goto _5
  2477. _4:
  2478. postStmt = nil
  2479. _5:
  2480. }
  2481. return &ForClauseNode{
  2482. InitStmt: initStmt,
  2483. SEMICOLON: semicolonTok,
  2484. Condition: condition,
  2485. SEMICOLON2: semicolon2Tok,
  2486. PostStmt: postStmt,
  2487. }
  2488. }
  2489. // ForStmtNode represents the production
  2490. //
  2491. // ForStmt = "for" [ ForClause | RangeClause | Condition ] Block .
  2492. type ForStmtNode struct {
  2493. FOR Token
  2494. ForClause *ForClauseNode
  2495. RangeClause *RangeClauseNode
  2496. Condition Expression
  2497. Block *BlockNode
  2498. }
  2499. // Source implements Node.
  2500. func (n *ForStmtNode) Source(full bool) string { return nodeSource(n, full) }
  2501. // Position implements Node.
  2502. func (n *ForStmtNode) Position() (r token.Position) {
  2503. if n == nil {
  2504. return r
  2505. }
  2506. return n.FOR.Position()
  2507. }
  2508. func (p *parser) forStmt() *ForStmtNode {
  2509. var (
  2510. forTok Token
  2511. forClause *ForClauseNode
  2512. rangeClause *RangeClauseNode
  2513. condition Expression
  2514. block *BlockNode
  2515. )
  2516. // ebnf.Sequence "for" [ ForClause | RangeClause | Condition ] Block ctx [FOR]
  2517. {
  2518. p.openScope()
  2519. defer p.closeScope()
  2520. ix := p.ix
  2521. // *ebnf.Token "for" ctx [FOR]
  2522. forTok = p.expect(FOR)
  2523. // *ebnf.Option [ ForClause | RangeClause | Condition ] ctx []
  2524. switch p.c() {
  2525. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, RANGE, SEMICOLON, STRING, STRUCT, SUB, XOR:
  2526. // ebnf.Alternative ForClause | RangeClause | Condition ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, RANGE, SEMICOLON, STRING, STRUCT, SUB, XOR]
  2527. switch p.c() {
  2528. case SEMICOLON: // 0
  2529. // *ebnf.Name ForClause ctx [SEMICOLON]
  2530. if forClause = p.forClause(); forClause == nil {
  2531. goto _2
  2532. }
  2533. break
  2534. _2:
  2535. forClause = nil
  2536. goto _0
  2537. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR: // 0 1 2
  2538. // *ebnf.Name ForClause ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  2539. if forClause = p.forClause(); forClause == nil {
  2540. goto _4
  2541. }
  2542. break
  2543. _4:
  2544. forClause = nil
  2545. // *ebnf.Name RangeClause ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  2546. if rangeClause = p.rangeClause(); rangeClause == nil {
  2547. goto _5
  2548. }
  2549. break
  2550. _5:
  2551. rangeClause = nil
  2552. // *ebnf.Name Condition ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  2553. if condition = p.condition(true); condition == nil {
  2554. goto _6
  2555. }
  2556. break
  2557. _6:
  2558. condition = nil
  2559. goto _0
  2560. case RANGE: // 1
  2561. // *ebnf.Name RangeClause ctx [RANGE]
  2562. if rangeClause = p.rangeClause(); rangeClause == nil {
  2563. goto _7
  2564. }
  2565. break
  2566. _7:
  2567. rangeClause = nil
  2568. goto _0
  2569. default:
  2570. goto _0
  2571. }
  2572. }
  2573. goto _1
  2574. _0:
  2575. forClause = nil
  2576. rangeClause = nil
  2577. _1:
  2578. // *ebnf.Name Block ctx []
  2579. switch p.c() {
  2580. case LBRACE:
  2581. if block = p.block(nil, nil); block == nil {
  2582. p.back(ix)
  2583. return nil
  2584. }
  2585. default:
  2586. p.back(ix)
  2587. return nil
  2588. }
  2589. }
  2590. return &ForStmtNode{
  2591. FOR: forTok,
  2592. ForClause: forClause,
  2593. RangeClause: rangeClause,
  2594. Condition: condition,
  2595. Block: block,
  2596. }
  2597. }
  2598. // FunctionBodyNode represents the production
  2599. //
  2600. // FunctionBody = Block .
  2601. type FunctionBodyNode struct {
  2602. Block *BlockNode
  2603. }
  2604. // Source implements Node.
  2605. func (n *FunctionBodyNode) Source(full bool) string { return nodeSource(n, full) }
  2606. // Position implements Node.
  2607. func (n *FunctionBodyNode) Position() (r token.Position) {
  2608. if n == nil {
  2609. return r
  2610. }
  2611. return n.Block.Position()
  2612. }
  2613. func (p *parser) functionBody(rx *ParametersNode, s *SignatureNode) *FunctionBodyNode {
  2614. var (
  2615. block *BlockNode
  2616. )
  2617. // *ebnf.Name Block ctx [LBRACE]
  2618. if block = p.block(rx, s); block == nil {
  2619. return nil
  2620. }
  2621. return &FunctionBodyNode{
  2622. Block: block,
  2623. }
  2624. }
  2625. // FunctionDeclNode represents the production
  2626. //
  2627. // FunctionDecl = "func" FunctionName [ TypeParameters ] Signature [ FunctionBody ] .
  2628. type FunctionDeclNode struct {
  2629. FUNC Token
  2630. FunctionName *FunctionNameNode
  2631. TypeParameters *TypeParametersNode
  2632. Signature *SignatureNode
  2633. FunctionBody *FunctionBodyNode
  2634. visible
  2635. }
  2636. // Source implements Node.
  2637. func (n *FunctionDeclNode) Source(full bool) string { return nodeSource(n, full) }
  2638. // Position implements Node.
  2639. func (n *FunctionDeclNode) Position() (r token.Position) {
  2640. if n == nil {
  2641. return r
  2642. }
  2643. return n.FUNC.Position()
  2644. }
  2645. func (p *parser) functionDecl() (r *FunctionDeclNode) {
  2646. var (
  2647. funcTok Token
  2648. functionName *FunctionNameNode
  2649. typeParameters *TypeParametersNode
  2650. signature *SignatureNode
  2651. functionBody *FunctionBodyNode
  2652. )
  2653. // ebnf.Sequence "func" FunctionName [ TypeParameters ] Signature [ FunctionBody ] ctx [FUNC]
  2654. {
  2655. if p.peek(1) != IDENT {
  2656. return nil
  2657. }
  2658. ix := p.ix
  2659. // *ebnf.Token "func" ctx [FUNC]
  2660. funcTok = p.expect(FUNC)
  2661. // *ebnf.Name FunctionName ctx [IDENT]
  2662. if functionName = p.functionName(); functionName == nil {
  2663. p.back(ix)
  2664. return nil
  2665. }
  2666. // *ebnf.Option [ TypeParameters ] ctx []
  2667. switch p.c() {
  2668. case LBRACK:
  2669. // *ebnf.Name TypeParameters ctx [LBRACK]
  2670. if typeParameters = p.typeParameters(); typeParameters == nil {
  2671. goto _0
  2672. }
  2673. }
  2674. goto _1
  2675. _0:
  2676. typeParameters = nil
  2677. _1:
  2678. // *ebnf.Name Signature ctx []
  2679. switch p.c() {
  2680. case LPAREN:
  2681. if signature = p.signature(); signature == nil {
  2682. p.back(ix)
  2683. return nil
  2684. }
  2685. default:
  2686. p.back(ix)
  2687. return nil
  2688. }
  2689. // *ebnf.Option [ FunctionBody ] ctx []
  2690. switch p.c() {
  2691. case LBRACE:
  2692. // *ebnf.Name FunctionBody ctx [LBRACE]
  2693. if functionBody = p.functionBody(nil, signature); functionBody == nil {
  2694. goto _2
  2695. }
  2696. }
  2697. goto _3
  2698. _2:
  2699. functionBody = nil
  2700. _3:
  2701. }
  2702. sc := p.sc
  2703. r = &FunctionDeclNode{
  2704. FUNC: funcTok,
  2705. FunctionName: functionName,
  2706. TypeParameters: typeParameters,
  2707. Signature: signature,
  2708. FunctionBody: functionBody,
  2709. }
  2710. p.declare(sc, functionName.IDENT, r, 0, true)
  2711. return r
  2712. }
  2713. // FunctionLitNode represents the production
  2714. //
  2715. // FunctionLit = "func" Signature FunctionBody .
  2716. type FunctionLitNode struct {
  2717. FUNC Token
  2718. Signature *SignatureNode
  2719. FunctionBody *FunctionBodyNode
  2720. }
  2721. // Source implements Node.
  2722. func (n *FunctionLitNode) Source(full bool) string { return nodeSource(n, full) }
  2723. // Position implements Node.
  2724. func (n *FunctionLitNode) Position() (r token.Position) {
  2725. if n == nil {
  2726. return r
  2727. }
  2728. return n.FUNC.Position()
  2729. }
  2730. func (p *parser) functionLit() *FunctionLitNode {
  2731. var (
  2732. funcTok Token
  2733. signature *SignatureNode
  2734. functionBody *FunctionBodyNode
  2735. )
  2736. // ebnf.Sequence "func" Signature FunctionBody ctx [FUNC]
  2737. {
  2738. switch p.peek(1) {
  2739. case LPAREN:
  2740. default:
  2741. return nil
  2742. }
  2743. ix := p.ix
  2744. // *ebnf.Token "func" ctx [FUNC]
  2745. funcTok = p.expect(FUNC)
  2746. // *ebnf.Name Signature ctx [LPAREN]
  2747. if signature = p.signature(); signature == nil {
  2748. p.back(ix)
  2749. return nil
  2750. }
  2751. // *ebnf.Name FunctionBody ctx []
  2752. switch p.c() {
  2753. case LBRACE:
  2754. if functionBody = p.functionBody(nil, signature); functionBody == nil {
  2755. p.back(ix)
  2756. return nil
  2757. }
  2758. default:
  2759. p.back(ix)
  2760. return nil
  2761. }
  2762. }
  2763. return &FunctionLitNode{
  2764. FUNC: funcTok,
  2765. Signature: signature,
  2766. FunctionBody: functionBody,
  2767. }
  2768. }
  2769. // FunctionNameNode represents the production
  2770. //
  2771. // FunctionName = identifier .
  2772. type FunctionNameNode struct {
  2773. IDENT Token
  2774. }
  2775. // Source implements Node.
  2776. func (n *FunctionNameNode) Source(full bool) string { return nodeSource(n, full) }
  2777. // Position implements Node.
  2778. func (n *FunctionNameNode) Position() (r token.Position) {
  2779. if n == nil {
  2780. return r
  2781. }
  2782. return n.IDENT.Position()
  2783. }
  2784. func (p *parser) functionName() *FunctionNameNode {
  2785. var (
  2786. identTok Token
  2787. )
  2788. // *ebnf.Name identifier ctx [IDENT]
  2789. identTok = p.expect(IDENT)
  2790. return &FunctionNameNode{
  2791. IDENT: identTok,
  2792. }
  2793. }
  2794. // FunctionTypeNode represents the production
  2795. //
  2796. // FunctionType = "func" Signature .
  2797. type FunctionTypeNode struct {
  2798. FUNC Token
  2799. Signature *SignatureNode
  2800. guard
  2801. }
  2802. // Source implements Node.
  2803. func (n *FunctionTypeNode) Source(full bool) string { return nodeSource(n, full) }
  2804. // Position implements Node.
  2805. func (n *FunctionTypeNode) Position() (r token.Position) {
  2806. if n == nil {
  2807. return r
  2808. }
  2809. return n.FUNC.Position()
  2810. }
  2811. func (p *parser) functionType() *FunctionTypeNode {
  2812. var (
  2813. funcTok Token
  2814. signature *SignatureNode
  2815. )
  2816. // ebnf.Sequence "func" Signature ctx [FUNC]
  2817. {
  2818. switch p.peek(1) {
  2819. case LPAREN:
  2820. default:
  2821. return nil
  2822. }
  2823. ix := p.ix
  2824. // *ebnf.Token "func" ctx [FUNC]
  2825. funcTok = p.expect(FUNC)
  2826. // *ebnf.Name Signature ctx [LPAREN]
  2827. if signature = p.signature(); signature == nil {
  2828. p.back(ix)
  2829. return nil
  2830. }
  2831. }
  2832. return &FunctionTypeNode{
  2833. FUNC: funcTok,
  2834. Signature: signature,
  2835. }
  2836. }
  2837. // GoStmtNode represents the production
  2838. //
  2839. // GoStmt = "go" Expression .
  2840. type GoStmtNode struct {
  2841. GO Token
  2842. Expression Expression
  2843. }
  2844. // Source implements Node.
  2845. func (n *GoStmtNode) Source(full bool) string { return nodeSource(n, full) }
  2846. // Position implements Node.
  2847. func (n *GoStmtNode) Position() (r token.Position) {
  2848. if n == nil {
  2849. return r
  2850. }
  2851. return n.GO.Position()
  2852. }
  2853. func (p *parser) goStmt() *GoStmtNode {
  2854. var (
  2855. goTok Token
  2856. expression Expression
  2857. )
  2858. // ebnf.Sequence "go" Expression ctx [GO]
  2859. {
  2860. switch p.peek(1) {
  2861. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  2862. default:
  2863. return nil
  2864. }
  2865. ix := p.ix
  2866. // *ebnf.Token "go" ctx [GO]
  2867. goTok = p.expect(GO)
  2868. // *ebnf.Name Expression ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  2869. if expression = p.expression(false); expression == nil {
  2870. p.back(ix)
  2871. return nil
  2872. }
  2873. }
  2874. return &GoStmtNode{
  2875. GO: goTok,
  2876. Expression: expression,
  2877. }
  2878. }
  2879. // GotoStmtNode represents the production
  2880. //
  2881. // GotoStmt = "goto" Label .
  2882. type GotoStmtNode struct {
  2883. GOTO Token
  2884. Label *LabelNode
  2885. }
  2886. // Source implements Node.
  2887. func (n *GotoStmtNode) Source(full bool) string { return nodeSource(n, full) }
  2888. // Position implements Node.
  2889. func (n *GotoStmtNode) Position() (r token.Position) {
  2890. if n == nil {
  2891. return r
  2892. }
  2893. return n.GOTO.Position()
  2894. }
  2895. func (p *parser) gotoStmt() *GotoStmtNode {
  2896. var (
  2897. gotoTok Token
  2898. label *LabelNode
  2899. )
  2900. // ebnf.Sequence "goto" Label ctx [GOTO]
  2901. {
  2902. if p.peek(1) != IDENT {
  2903. return nil
  2904. }
  2905. ix := p.ix
  2906. // *ebnf.Token "goto" ctx [GOTO]
  2907. gotoTok = p.expect(GOTO)
  2908. // *ebnf.Name Label ctx [IDENT]
  2909. if label = p.label(); label == nil {
  2910. p.back(ix)
  2911. return nil
  2912. }
  2913. }
  2914. return &GotoStmtNode{
  2915. GOTO: gotoTok,
  2916. Label: label,
  2917. }
  2918. }
  2919. // IdentifierListNode represents the production
  2920. //
  2921. // IdentifierList = identifier { "," identifier } .
  2922. type IdentifierListNode struct {
  2923. COMMA Token
  2924. IDENT Token
  2925. List *IdentifierListNode
  2926. }
  2927. // Len reports the number of items in n.
  2928. func (n *IdentifierListNode) Len() (r int) {
  2929. for ; n != nil; n = n.List {
  2930. r++
  2931. }
  2932. return r
  2933. }
  2934. func (n *IdentifierListNode) first() (r Token) {
  2935. if n != nil {
  2936. r = n.IDENT
  2937. }
  2938. return r
  2939. }
  2940. // Source implements Node.
  2941. func (n *IdentifierListNode) Source(full bool) string { return nodeSource(n, full) }
  2942. // Position implements Node.
  2943. func (n *IdentifierListNode) Position() (r token.Position) {
  2944. if n == nil {
  2945. return r
  2946. }
  2947. if n.COMMA.IsValid() {
  2948. return n.COMMA.Position()
  2949. }
  2950. return n.IDENT.Position()
  2951. }
  2952. func (p *parser) identifierList() *IdentifierListNode {
  2953. var (
  2954. identTok Token
  2955. list, last *IdentifierListNode
  2956. )
  2957. // ebnf.Sequence identifier { "," identifier } ctx [IDENT]
  2958. {
  2959. // *ebnf.Name identifier ctx [IDENT]
  2960. identTok = p.expect(IDENT)
  2961. // *ebnf.Repetition { "," identifier } ctx []
  2962. list = &IdentifierListNode{
  2963. IDENT: identTok,
  2964. }
  2965. last = list
  2966. _0:
  2967. {
  2968. var commaTok Token
  2969. var identTok Token
  2970. switch p.c() {
  2971. case COMMA:
  2972. // ebnf.Sequence "," identifier ctx [COMMA]
  2973. if p.peek(1) != IDENT {
  2974. goto _1
  2975. }
  2976. // *ebnf.Token "," ctx [COMMA]
  2977. commaTok = p.expect(COMMA)
  2978. // *ebnf.Name identifier ctx [IDENT]
  2979. identTok = p.expect(IDENT)
  2980. next := &IdentifierListNode{
  2981. COMMA: commaTok,
  2982. IDENT: identTok,
  2983. }
  2984. last.List = next
  2985. last = next
  2986. goto _0
  2987. }
  2988. _1:
  2989. }
  2990. }
  2991. return list
  2992. }
  2993. // IfElseStmtNode represents the production
  2994. //
  2995. // IfStmt = "if" Expression Block [ "else" ( IfStmt | Block ) ] | "if" SimpleStmt ";" Expression Block [ "else" ( IfStmt | Block ) ] .
  2996. type IfElseStmtNode struct {
  2997. IF Token
  2998. Expression Expression
  2999. Block *BlockNode
  3000. ELSE Token
  3001. ElseClause Node
  3002. SimpleStmt Node
  3003. SEMICOLON Token
  3004. }
  3005. // Source implements Node.
  3006. func (n *IfElseStmtNode) Source(full bool) string { return nodeSource(n, full) }
  3007. // Position implements Node.
  3008. func (n *IfElseStmtNode) Position() (r token.Position) {
  3009. if n == nil {
  3010. return r
  3011. }
  3012. panic("TODO")
  3013. }
  3014. // IfStmtNode represents the production
  3015. //
  3016. // IfStmt = "if" Expression Block [ "else" ( IfStmt | Block ) ] | "if" SimpleStmt ";" Expression Block [ "else" ( IfStmt | Block ) ] .
  3017. type IfStmtNode struct {
  3018. IF Token
  3019. Expression Expression
  3020. Block *BlockNode
  3021. SimpleStmt Node
  3022. SEMICOLON Token
  3023. }
  3024. // Source implements Node.
  3025. func (n *IfStmtNode) Source(full bool) string { return nodeSource(n, full) }
  3026. // Position implements Node.
  3027. func (n *IfStmtNode) Position() (r token.Position) {
  3028. if n == nil {
  3029. return r
  3030. }
  3031. panic("TODO")
  3032. }
  3033. func (p *parser) ifStmt() Node {
  3034. var (
  3035. ok bool
  3036. ifTok Token
  3037. expression Expression
  3038. block *BlockNode
  3039. elseTok Token
  3040. ifStmt Node
  3041. block2 *BlockNode
  3042. simpleStmt Node
  3043. semicolonTok Token
  3044. )
  3045. // ebnf.Alternative "if" Expression Block [ "else" ( IfStmt | Block ) ] | "if" SimpleStmt ";" Expression Block [ "else" ( IfStmt | Block ) ] ctx [IF]
  3046. switch p.c() {
  3047. case IF: // 0 1
  3048. p.openScope()
  3049. defer p.closeScope()
  3050. // ebnf.Sequence "if" Expression Block [ "else" ( IfStmt | Block ) ] ctx [IF]
  3051. {
  3052. switch p.peek(1) {
  3053. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  3054. default:
  3055. goto _0
  3056. }
  3057. ix := p.ix
  3058. // *ebnf.Token "if" ctx [IF]
  3059. ifTok = p.expect(IF)
  3060. // *ebnf.Name Expression ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  3061. if expression = p.expression(true); expression == nil {
  3062. p.back(ix)
  3063. goto _0
  3064. }
  3065. // *ebnf.Name Block ctx []
  3066. switch p.c() {
  3067. case LBRACE:
  3068. if block = p.block(nil, nil); block == nil {
  3069. p.back(ix)
  3070. goto _0
  3071. }
  3072. default:
  3073. p.back(ix)
  3074. goto _0
  3075. }
  3076. // *ebnf.Option [ "else" ( IfStmt | Block ) ] ctx []
  3077. switch p.c() {
  3078. case ELSE:
  3079. // ebnf.Sequence "else" ( IfStmt | Block ) ctx [ELSE]
  3080. {
  3081. switch p.peek(1) {
  3082. case IF, LBRACE:
  3083. default:
  3084. goto _1
  3085. }
  3086. ix := p.ix
  3087. // *ebnf.Token "else" ctx [ELSE]
  3088. elseTok = p.expect(ELSE)
  3089. // *ebnf.Group ( IfStmt | Block ) ctx [IF, LBRACE]
  3090. // ebnf.Alternative IfStmt | Block ctx [IF, LBRACE]
  3091. switch p.c() {
  3092. case IF: // 0
  3093. // *ebnf.Name IfStmt ctx [IF]
  3094. if ifStmt = p.ifStmt(); ifStmt == nil {
  3095. goto _3
  3096. }
  3097. break
  3098. _3:
  3099. ifStmt = nil
  3100. p.back(ix)
  3101. goto _1
  3102. case LBRACE: // 1
  3103. // *ebnf.Name Block ctx [LBRACE]
  3104. if block2 = p.block(nil, nil); block2 == nil {
  3105. goto _5
  3106. }
  3107. break
  3108. _5:
  3109. block2 = nil
  3110. p.back(ix)
  3111. goto _1
  3112. default:
  3113. p.back(ix)
  3114. goto _1
  3115. }
  3116. }
  3117. default:
  3118. return &IfStmtNode{
  3119. IF: ifTok,
  3120. Expression: expression,
  3121. Block: block,
  3122. SimpleStmt: simpleStmt,
  3123. SEMICOLON: semicolonTok,
  3124. }
  3125. }
  3126. goto _2
  3127. _1:
  3128. block2 = nil
  3129. elseTok = Token{}
  3130. ifStmt = nil
  3131. _2:
  3132. }
  3133. break
  3134. _0:
  3135. block = nil
  3136. block2 = nil
  3137. elseTok = Token{}
  3138. expression = nil
  3139. ifStmt = nil
  3140. ifTok = Token{}
  3141. // ebnf.Sequence "if" SimpleStmt ";" Expression Block [ "else" ( IfStmt | Block ) ] ctx [IF]
  3142. {
  3143. ix := p.ix
  3144. // *ebnf.Token "if" ctx [IF]
  3145. ifTok = p.expect(IF)
  3146. // *ebnf.Name SimpleStmt ctx []
  3147. switch p.c() {
  3148. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR /* ε */ :
  3149. if simpleStmt = p.simpleStmt(false); simpleStmt == nil {
  3150. p.back(ix)
  3151. goto _7
  3152. }
  3153. }
  3154. // *ebnf.Token ";" ctx []
  3155. if semicolonTok, ok = p.accept(SEMICOLON); !ok {
  3156. p.back(ix)
  3157. goto _7
  3158. }
  3159. // *ebnf.Name Expression ctx []
  3160. switch p.c() {
  3161. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  3162. if expression = p.expression(true); expression == nil {
  3163. p.back(ix)
  3164. goto _7
  3165. }
  3166. default:
  3167. p.back(ix)
  3168. goto _7
  3169. }
  3170. // *ebnf.Name Block ctx []
  3171. switch p.c() {
  3172. case LBRACE:
  3173. if block = p.block(nil, nil); block == nil {
  3174. p.back(ix)
  3175. goto _7
  3176. }
  3177. default:
  3178. p.back(ix)
  3179. goto _7
  3180. }
  3181. // *ebnf.Option [ "else" ( IfStmt | Block ) ] ctx []
  3182. switch p.c() {
  3183. case ELSE:
  3184. // ebnf.Sequence "else" ( IfStmt | Block ) ctx [ELSE]
  3185. {
  3186. switch p.peek(1) {
  3187. case IF, LBRACE:
  3188. default:
  3189. goto _8
  3190. }
  3191. ix := p.ix
  3192. // *ebnf.Token "else" ctx [ELSE]
  3193. elseTok = p.expect(ELSE)
  3194. // *ebnf.Group ( IfStmt | Block ) ctx [IF, LBRACE]
  3195. // ebnf.Alternative IfStmt | Block ctx [IF, LBRACE]
  3196. switch p.c() {
  3197. case IF: // 0
  3198. // *ebnf.Name IfStmt ctx [IF]
  3199. if ifStmt = p.ifStmt(); ifStmt == nil {
  3200. goto _10
  3201. }
  3202. break
  3203. _10:
  3204. ifStmt = nil
  3205. p.back(ix)
  3206. goto _8
  3207. case LBRACE: // 1
  3208. // *ebnf.Name Block ctx [LBRACE]
  3209. if block2 = p.block(nil, nil); block2 == nil {
  3210. goto _12
  3211. }
  3212. break
  3213. _12:
  3214. block2 = nil
  3215. p.back(ix)
  3216. goto _8
  3217. default:
  3218. p.back(ix)
  3219. goto _8
  3220. }
  3221. }
  3222. }
  3223. goto _9
  3224. _8:
  3225. block2 = nil
  3226. elseTok = Token{}
  3227. ifStmt = nil
  3228. _9:
  3229. }
  3230. break
  3231. _7:
  3232. block = nil
  3233. block2 = nil
  3234. elseTok = Token{}
  3235. expression = nil
  3236. ifStmt = nil
  3237. ifTok = Token{}
  3238. semicolonTok = Token{}
  3239. simpleStmt = nil
  3240. return nil
  3241. default:
  3242. return nil
  3243. }
  3244. var elseClause Node
  3245. switch {
  3246. case ifStmt != nil:
  3247. elseClause = ifStmt
  3248. case block2 != nil:
  3249. elseClause = block2
  3250. }
  3251. return &IfElseStmtNode{
  3252. IF: ifTok,
  3253. Expression: expression,
  3254. Block: block,
  3255. ELSE: elseTok,
  3256. ElseClause: elseClause,
  3257. SimpleStmt: simpleStmt,
  3258. SEMICOLON: semicolonTok,
  3259. }
  3260. }
  3261. // ImportSpecListNode represents the production
  3262. //
  3263. // ImportSpecListNode = { ImportSpec ";" } .
  3264. type ImportSpecListNode struct {
  3265. ImportSpec *ImportSpecNode
  3266. SEMICOLON Token
  3267. List *ImportSpecListNode
  3268. }
  3269. // Source implements Node.
  3270. func (n *ImportSpecListNode) Source(full bool) string { return nodeSource(n, full) }
  3271. // Position implements Node.
  3272. func (n *ImportSpecListNode) Position() (r token.Position) {
  3273. if n == nil {
  3274. return r
  3275. }
  3276. return n.ImportSpec.Position()
  3277. }
  3278. // ImportDeclNode represents the production
  3279. //
  3280. // ImportDecl = "import" ( ImportSpec | "(" { ImportSpec ";" } ")" ) .
  3281. type ImportDeclNode struct {
  3282. IMPORT Token
  3283. LPAREN Token
  3284. ImportSpecList *ImportSpecListNode
  3285. RPAREN Token
  3286. }
  3287. // Source implements Node.
  3288. func (n *ImportDeclNode) Source(full bool) string { return nodeSource(n, full) }
  3289. // Position implements Node.
  3290. func (n *ImportDeclNode) Position() (r token.Position) {
  3291. if n == nil {
  3292. return r
  3293. }
  3294. return n.IMPORT.Position()
  3295. }
  3296. func (p *parser) importDecl() *ImportDeclNode {
  3297. var (
  3298. ok bool
  3299. importTok Token
  3300. importSpec *ImportSpecNode
  3301. lparenTok Token
  3302. list, last *ImportSpecListNode
  3303. rparenTok Token
  3304. )
  3305. // ebnf.Sequence "import" ( ImportSpec | "(" { ImportSpec ";" } [ ImportSpec ] ")" ) ctx [IMPORT]
  3306. {
  3307. switch p.peek(1) {
  3308. case IDENT, LPAREN, PERIOD, STRING:
  3309. default:
  3310. return nil
  3311. }
  3312. ix := p.ix
  3313. // *ebnf.Token "import" ctx [IMPORT]
  3314. importTok = p.expect(IMPORT)
  3315. // *ebnf.Group ( ImportSpec | "(" { ImportSpec ";" } [ ImportSpec ] ")" ) ctx [IDENT, LPAREN, PERIOD, STRING]
  3316. // ebnf.Alternative ImportSpec | "(" { ImportSpec ";" } [ ImportSpec ] ")" ctx [IDENT, LPAREN, PERIOD, STRING]
  3317. switch p.c() {
  3318. case IDENT, PERIOD, STRING: // 0
  3319. // *ebnf.Name ImportSpec ctx [IDENT, PERIOD, STRING]
  3320. if importSpec = p.importSpec(); importSpec == nil {
  3321. goto _0
  3322. }
  3323. list = &ImportSpecListNode{
  3324. ImportSpec: importSpec,
  3325. }
  3326. break
  3327. _0:
  3328. importSpec = nil
  3329. p.back(ix)
  3330. return nil
  3331. case LPAREN: // 1
  3332. // ebnf.Sequence "(" { ImportSpec ";" } [ ImportSpec ] ")" ctx [LPAREN]
  3333. {
  3334. ix := p.ix
  3335. // *ebnf.Token "(" ctx [LPAREN]
  3336. lparenTok = p.expect(LPAREN)
  3337. // *ebnf.Repetition { ImportSpec ";" } ctx []
  3338. _4:
  3339. {
  3340. var importSpec *ImportSpecNode
  3341. var semicolonTok Token
  3342. switch p.c() {
  3343. case IDENT, PERIOD, STRING:
  3344. // ebnf.Sequence ImportSpec ";" ctx [IDENT, PERIOD, STRING]
  3345. ix := p.ix
  3346. // *ebnf.Name ImportSpec ctx [IDENT, PERIOD, STRING]
  3347. if importSpec = p.importSpec(); importSpec == nil {
  3348. p.back(ix)
  3349. goto _5
  3350. }
  3351. // *ebnf.Token ";" ctx []
  3352. if semicolonTok, ok = p.accept(SEMICOLON); !ok {
  3353. next := &ImportSpecListNode{
  3354. ImportSpec: importSpec,
  3355. }
  3356. if last != nil {
  3357. last.List = next
  3358. }
  3359. if list == nil {
  3360. list = next
  3361. }
  3362. last = next
  3363. goto _5
  3364. }
  3365. next := &ImportSpecListNode{
  3366. ImportSpec: importSpec,
  3367. SEMICOLON: semicolonTok,
  3368. }
  3369. if last != nil {
  3370. last.List = next
  3371. }
  3372. if list == nil {
  3373. list = next
  3374. }
  3375. last = next
  3376. goto _4
  3377. }
  3378. _5:
  3379. }
  3380. // *ebnf.Token ")" ctx []
  3381. if rparenTok, ok = p.accept(RPAREN); !ok {
  3382. p.back(ix)
  3383. goto _2
  3384. }
  3385. }
  3386. break
  3387. _2:
  3388. lparenTok = Token{}
  3389. rparenTok = Token{}
  3390. p.back(ix)
  3391. return nil
  3392. default:
  3393. p.back(ix)
  3394. return nil
  3395. }
  3396. }
  3397. return &ImportDeclNode{
  3398. IMPORT: importTok,
  3399. LPAREN: lparenTok,
  3400. ImportSpecList: list,
  3401. RPAREN: rparenTok,
  3402. }
  3403. }
  3404. // ImportSpecNode represents the production
  3405. //
  3406. // ImportSpec = [ "." | PackageName ] ImportPath .
  3407. type ImportSpecNode struct {
  3408. PERIOD Token
  3409. PackageName Token
  3410. ImportPath *BasicLitNode
  3411. pkg *Package
  3412. visible
  3413. }
  3414. // Source implements Node.
  3415. func (n *ImportSpecNode) Source(full bool) string { return nodeSource(n, full) }
  3416. // Position implements Node.
  3417. func (n *ImportSpecNode) Position() (r token.Position) {
  3418. if n == nil {
  3419. return r
  3420. }
  3421. if n.PERIOD.IsValid() {
  3422. return n.PERIOD.Position()
  3423. }
  3424. if n.PackageName.IsValid() {
  3425. return n.PackageName.Position()
  3426. }
  3427. return n.ImportPath.Position()
  3428. }
  3429. func (p *parser) importSpec() *ImportSpecNode {
  3430. var (
  3431. periodTok Token
  3432. packageName Token
  3433. importPath *BasicLitNode
  3434. )
  3435. // ebnf.Sequence [ "." | PackageName ] ImportPath ctx [IDENT, PERIOD, STRING]
  3436. {
  3437. ix := p.ix
  3438. // *ebnf.Option [ "." | PackageName ] ctx [IDENT, PERIOD, STRING]
  3439. switch p.c() {
  3440. case IDENT, PERIOD:
  3441. // ebnf.Alternative "." | PackageName ctx [IDENT, PERIOD]
  3442. switch p.c() {
  3443. case PERIOD: // 0
  3444. // *ebnf.Token "." ctx [PERIOD]
  3445. periodTok = p.expect(PERIOD)
  3446. case IDENT: // 1
  3447. // *ebnf.Name PackageName ctx [IDENT]
  3448. if packageName = p.packageName(); !packageName.IsValid() {
  3449. goto _4
  3450. }
  3451. break
  3452. _4:
  3453. packageName = Token{}
  3454. goto _0
  3455. default:
  3456. goto _0
  3457. }
  3458. }
  3459. goto _1
  3460. _0:
  3461. packageName = Token{}
  3462. periodTok = Token{}
  3463. _1:
  3464. // *ebnf.Name ImportPath ctx []
  3465. switch p.c() {
  3466. case STRING:
  3467. if importPath = p.basicLit().(*BasicLitNode); importPath == nil {
  3468. p.back(ix)
  3469. return nil
  3470. }
  3471. default:
  3472. p.back(ix)
  3473. return nil
  3474. }
  3475. }
  3476. return &ImportSpecNode{
  3477. PERIOD: periodTok,
  3478. PackageName: packageName,
  3479. ImportPath: importPath,
  3480. }
  3481. }
  3482. // IndexNode represents the production
  3483. //
  3484. // Index = "[" Expression "]" .
  3485. type IndexNode struct {
  3486. LBRACK Token
  3487. Expression Expression
  3488. RBRACK Token
  3489. }
  3490. // Source implements Node.
  3491. func (n *IndexNode) Source(full bool) string { return nodeSource(n, full) }
  3492. // Position implements Node.
  3493. func (n *IndexNode) Position() (r token.Position) {
  3494. if n == nil {
  3495. return r
  3496. }
  3497. return n.LBRACK.Position()
  3498. }
  3499. func (p *parser) index() *IndexNode {
  3500. var (
  3501. ok bool
  3502. lbrackTok Token
  3503. expression Expression
  3504. rbrackTok Token
  3505. )
  3506. // ebnf.Sequence "[" Expression "]" ctx [LBRACK]
  3507. {
  3508. switch p.peek(1) {
  3509. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  3510. default:
  3511. return nil
  3512. }
  3513. ix := p.ix
  3514. // *ebnf.Token "[" ctx [LBRACK]
  3515. lbrackTok = p.expect(LBRACK)
  3516. // *ebnf.Name Expression ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  3517. if expression = p.expression(false); expression == nil {
  3518. p.back(ix)
  3519. return nil
  3520. }
  3521. // *ebnf.Token "]" ctx []
  3522. if rbrackTok, ok = p.accept(RBRACK); !ok {
  3523. p.back(ix)
  3524. return nil
  3525. }
  3526. }
  3527. return &IndexNode{
  3528. LBRACK: lbrackTok,
  3529. Expression: expression,
  3530. RBRACK: rbrackTok,
  3531. }
  3532. }
  3533. func (p *parser) initStmt() Node {
  3534. // *ebnf.Name SimpleStmt ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR /* ε */]
  3535. return p.simpleStmt(true)
  3536. }
  3537. // InterfaceElemNode represents the production
  3538. //
  3539. // InterfaceElem = MethodElem | TypeElem .
  3540. type InterfaceElemNode struct {
  3541. MethodElem *MethodElemNode
  3542. TypeElem *TypeElemListNode
  3543. }
  3544. // Source implements Node.
  3545. func (n *InterfaceElemNode) Source(full bool) string { return nodeSource(n, full) }
  3546. // Position implements Node.
  3547. func (n *InterfaceElemNode) Position() (r token.Position) {
  3548. if n == nil {
  3549. return r
  3550. }
  3551. if n.MethodElem != nil {
  3552. return n.MethodElem.Position()
  3553. }
  3554. return n.TypeElem.Position()
  3555. }
  3556. func (p *parser) interfaceElem() *InterfaceElemNode {
  3557. var (
  3558. methodElem *MethodElemNode
  3559. typeElem *TypeElemListNode
  3560. )
  3561. // ebnf.Alternative MethodElem | TypeElem ctx [ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT, TILDE]
  3562. switch p.c() {
  3563. case IDENT: // 0 1
  3564. // *ebnf.Name MethodElem ctx [IDENT]
  3565. if methodElem = p.methodElem(); methodElem == nil {
  3566. goto _0
  3567. }
  3568. break
  3569. _0:
  3570. methodElem = nil
  3571. // *ebnf.Name TypeElem ctx [IDENT]
  3572. if typeElem = p.typeElem(); typeElem == nil {
  3573. goto _1
  3574. }
  3575. break
  3576. _1:
  3577. typeElem = nil
  3578. return nil
  3579. case ARROW, CHAN, FUNC, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT, TILDE: // 1
  3580. // *ebnf.Name TypeElem ctx [ARROW, CHAN, FUNC, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT, TILDE]
  3581. if typeElem = p.typeElem(); typeElem == nil {
  3582. goto _2
  3583. }
  3584. break
  3585. _2:
  3586. typeElem = nil
  3587. return nil
  3588. default:
  3589. return nil
  3590. }
  3591. return &InterfaceElemNode{
  3592. MethodElem: methodElem,
  3593. TypeElem: typeElem,
  3594. }
  3595. }
  3596. // InterfaceElemListNode represents the production
  3597. //
  3598. // InterfaceElemListNode = { InterfaceElem ";" } .
  3599. type InterfaceElemListNode struct {
  3600. InterfaceElem *InterfaceElemNode
  3601. SEMICOLON Token
  3602. List *InterfaceElemListNode
  3603. }
  3604. // Source implements Node.
  3605. func (n *InterfaceElemListNode) Source(full bool) string { return nodeSource(n, full) }
  3606. // Position implements Node.
  3607. func (n *InterfaceElemListNode) Position() (r token.Position) {
  3608. if n == nil {
  3609. return r
  3610. }
  3611. return n.InterfaceElem.Position()
  3612. }
  3613. // InterfaceTypeNode represents the production
  3614. //
  3615. // InterfaceType = "interface" "{" { InterfaceElem ";" } "}" .
  3616. type InterfaceTypeNode struct {
  3617. INTERFACE Token
  3618. LBRACE Token
  3619. InterfaceElemList *InterfaceElemListNode
  3620. RBRACE Token
  3621. guard
  3622. methods map[string]*MethodElemNode
  3623. }
  3624. // Source implements Node.
  3625. func (n *InterfaceTypeNode) Source(full bool) string { return nodeSource(n, full) }
  3626. // Position implements Node.
  3627. func (n *InterfaceTypeNode) Position() (r token.Position) {
  3628. if n == nil {
  3629. return r
  3630. }
  3631. return n.INTERFACE.Position()
  3632. }
  3633. func (p *parser) interfaceType() *InterfaceTypeNode {
  3634. var (
  3635. ok bool
  3636. interfaceTok Token
  3637. lbraceTok Token
  3638. list, last *InterfaceElemListNode
  3639. rbraceTok Token
  3640. )
  3641. // ebnf.Sequence "interface" "{" { InterfaceElem ";" } [ InterfaceElem ] "}" ctx [INTERFACE]
  3642. {
  3643. if p.peek(1) != LBRACE {
  3644. return nil
  3645. }
  3646. ix := p.ix
  3647. // *ebnf.Token "interface" ctx [INTERFACE]
  3648. interfaceTok = p.expect(INTERFACE)
  3649. // *ebnf.Token "{" ctx [LBRACE]
  3650. lbraceTok = p.expect(LBRACE)
  3651. // *ebnf.Repetition { InterfaceElem ";" } ctx []
  3652. _0:
  3653. {
  3654. var interfaceElem *InterfaceElemNode
  3655. var semicolonTok Token
  3656. switch p.c() {
  3657. case ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT, TILDE:
  3658. // ebnf.Sequence InterfaceElem ";" ctx [ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT, TILDE]
  3659. ix := p.ix
  3660. // *ebnf.Name InterfaceElem ctx [ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT, TILDE]
  3661. if interfaceElem = p.interfaceElem(); interfaceElem == nil {
  3662. p.back(ix)
  3663. goto _1
  3664. }
  3665. // *ebnf.Token ";" ctx []
  3666. if semicolonTok, ok = p.accept(SEMICOLON); !ok {
  3667. next := &InterfaceElemListNode{
  3668. InterfaceElem: interfaceElem,
  3669. }
  3670. if last != nil {
  3671. last.List = next
  3672. }
  3673. if list == nil {
  3674. list = next
  3675. }
  3676. last = next
  3677. goto _1
  3678. }
  3679. next := &InterfaceElemListNode{
  3680. InterfaceElem: interfaceElem,
  3681. SEMICOLON: semicolonTok,
  3682. }
  3683. if last != nil {
  3684. last.List = next
  3685. }
  3686. if list == nil {
  3687. list = next
  3688. }
  3689. last = next
  3690. goto _0
  3691. }
  3692. _1:
  3693. }
  3694. // *ebnf.Token "}" ctx []
  3695. if rbraceTok, ok = p.accept(RBRACE); !ok {
  3696. p.back(ix)
  3697. return nil
  3698. }
  3699. }
  3700. return &InterfaceTypeNode{
  3701. INTERFACE: interfaceTok,
  3702. LBRACE: lbraceTok,
  3703. InterfaceElemList: list,
  3704. RBRACE: rbraceTok,
  3705. }
  3706. }
  3707. // KeyedElementNode represents the production
  3708. //
  3709. // KeyedElement = Element [ ":" Element ] .
  3710. type KeyedElementNode struct {
  3711. Element Expression
  3712. COLON Token
  3713. Element2 Expression
  3714. }
  3715. // Source implements Node.
  3716. func (n *KeyedElementNode) Source(full bool) string { return nodeSource(n, full) }
  3717. // Position implements Node.
  3718. func (n *KeyedElementNode) Position() (r token.Position) {
  3719. if n == nil {
  3720. return r
  3721. }
  3722. return n.Element.Position()
  3723. }
  3724. func (p *parser) keyedElement() Expression {
  3725. var (
  3726. element Expression
  3727. colonTok Token
  3728. element2 Expression
  3729. )
  3730. // ebnf.Sequence Element [ ":" Element ] ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  3731. {
  3732. ix := p.ix
  3733. // *ebnf.Name Element ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  3734. if element = p.element(); element == nil {
  3735. p.back(ix)
  3736. return nil
  3737. }
  3738. // *ebnf.Option [ ":" Element ] ctx []
  3739. switch p.c() {
  3740. case COLON:
  3741. // ebnf.Sequence ":" Element ctx [COLON]
  3742. {
  3743. switch p.peek(1) {
  3744. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  3745. default:
  3746. goto _0
  3747. }
  3748. ix := p.ix
  3749. // *ebnf.Token ":" ctx [COLON]
  3750. colonTok = p.expect(COLON)
  3751. // *ebnf.Name Element ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  3752. if element2 = p.element(); element2 == nil {
  3753. p.back(ix)
  3754. goto _0
  3755. }
  3756. }
  3757. }
  3758. goto _1
  3759. _0:
  3760. colonTok = Token{}
  3761. element2 = nil
  3762. _1:
  3763. }
  3764. if !colonTok.IsValid() {
  3765. return element
  3766. }
  3767. return &KeyedElementNode{
  3768. Element: element,
  3769. COLON: colonTok,
  3770. Element2: element2,
  3771. }
  3772. }
  3773. // LabelNode represents the production
  3774. //
  3775. // Label = identifier .
  3776. type LabelNode struct {
  3777. IDENT Token
  3778. }
  3779. // Source implements Node.
  3780. func (n *LabelNode) Source(full bool) string { return nodeSource(n, full) }
  3781. // Position implements Node.
  3782. func (n *LabelNode) Position() (r token.Position) {
  3783. if n == nil {
  3784. return r
  3785. }
  3786. return n.IDENT.Position()
  3787. }
  3788. func (p *parser) label() *LabelNode {
  3789. var (
  3790. identTok Token
  3791. )
  3792. // *ebnf.Name identifier ctx [IDENT]
  3793. identTok = p.expect(IDENT)
  3794. return &LabelNode{
  3795. IDENT: identTok,
  3796. }
  3797. }
  3798. // LabeledStmtNode represents the production
  3799. //
  3800. // LabeledStmt = Label ":" Statement .
  3801. type LabeledStmtNode struct {
  3802. Label *LabelNode
  3803. COLON Token
  3804. Statement Node
  3805. }
  3806. // Source implements Node.
  3807. func (n *LabeledStmtNode) Source(full bool) string { return nodeSource(n, full) }
  3808. // Position implements Node.
  3809. func (n *LabeledStmtNode) Position() (r token.Position) {
  3810. if n == nil {
  3811. return r
  3812. }
  3813. return n.Label.Position()
  3814. }
  3815. func (p *parser) labeledStmt() *LabeledStmtNode {
  3816. var (
  3817. label *LabelNode
  3818. colonTok Token
  3819. statement Node
  3820. )
  3821. // ebnf.Sequence Label ":" Statement ctx [IDENT]
  3822. {
  3823. if p.peek(1) != COLON {
  3824. return nil
  3825. }
  3826. ix := p.ix
  3827. // *ebnf.Name Label ctx [IDENT]
  3828. if label = p.label(); label == nil {
  3829. p.back(ix)
  3830. return nil
  3831. }
  3832. // *ebnf.Token ":" ctx [COLON]
  3833. colonTok = p.expect(COLON)
  3834. // *ebnf.Name Statement ctx []
  3835. switch p.c() {
  3836. case ADD, AND, ARROW, BREAK, CHAN, CHAR, CONST, CONTINUE, DEFER, FALLTHROUGH, FLOAT, FOR, FUNC, GO, GOTO, IDENT, IF, IMAG, INT, INTERFACE, LBRACE, LBRACK, LPAREN, MAP, MUL, NOT, RETURN, SELECT, STRING, STRUCT, SUB, SWITCH, TYPE, VAR, XOR /* ε */ :
  3837. if statement = p.statement(); statement == nil {
  3838. p.back(ix)
  3839. return nil
  3840. }
  3841. }
  3842. }
  3843. return &LabeledStmtNode{
  3844. Label: label,
  3845. COLON: colonTok,
  3846. Statement: statement,
  3847. }
  3848. }
  3849. func (p *parser) literal() Expression {
  3850. var (
  3851. basicLit Expression
  3852. compositeLit *CompositeLitNode
  3853. functionLit *FunctionLitNode
  3854. )
  3855. // ebnf.Alternative BasicLit | CompositeLit | FunctionLit ctx [CHAR, FLOAT, FUNC, IMAG, INT, LBRACK, MAP, STRING, STRUCT]
  3856. switch p.c() {
  3857. case CHAR, FLOAT, IMAG, INT, STRING: // 0
  3858. // *ebnf.Name BasicLit ctx [CHAR, FLOAT, IMAG, INT, STRING]
  3859. if basicLit = p.basicLit(); basicLit == nil {
  3860. return nil
  3861. }
  3862. return basicLit
  3863. case LBRACK, MAP, STRUCT: // 1
  3864. // *ebnf.Name CompositeLit ctx [LBRACK, MAP, STRUCT]
  3865. if compositeLit = p.compositeLit(); compositeLit == nil {
  3866. return nil
  3867. }
  3868. return compositeLit
  3869. case FUNC: // 2
  3870. // *ebnf.Name FunctionLit ctx [FUNC]
  3871. if functionLit = p.functionLit(); functionLit == nil {
  3872. return nil
  3873. }
  3874. return functionLit
  3875. default:
  3876. return nil
  3877. }
  3878. }
  3879. // ArrayLiteralTypeNode represents the production
  3880. //
  3881. // ArrayLiteralType = StructType | ArrayType | "[" "..." "]" ElementType | SliceType | MapType .
  3882. type ArrayLiteralTypeNode struct {
  3883. LBRACK Token
  3884. ELLIPSIS Token
  3885. RBRACK Token
  3886. ElementType Node
  3887. }
  3888. // Source implements Node.
  3889. func (n *ArrayLiteralTypeNode) Source(full bool) string { return nodeSource(n, full) }
  3890. // Position implements Node.
  3891. func (n *ArrayLiteralTypeNode) Position() (r token.Position) {
  3892. if n == nil {
  3893. return r
  3894. }
  3895. return n.LBRACK.Position()
  3896. }
  3897. func (p *parser) literalType() Node {
  3898. var (
  3899. ok bool
  3900. structType *StructTypeNode
  3901. arrayType *ArrayTypeNode
  3902. lbrackTok Token
  3903. ellipsisTok Token
  3904. rbrackTok Token
  3905. elementType Node
  3906. sliceType *SliceTypeNode
  3907. mapType *MapTypeNode
  3908. )
  3909. // ebnf.Alternative StructType | ArrayType | "[" "..." "]" ElementType | SliceType | MapType ctx [LBRACK, MAP, STRUCT]
  3910. switch p.c() {
  3911. case STRUCT: // 0
  3912. // *ebnf.Name StructType ctx [STRUCT]
  3913. if structType = p.structType(); structType != nil {
  3914. return structType
  3915. }
  3916. case LBRACK: // 1 2 3
  3917. // *ebnf.Name ArrayType ctx [LBRACK]
  3918. if arrayType = p.arrayType(); arrayType != nil {
  3919. return arrayType
  3920. }
  3921. // ebnf.Sequence "[" "..." "]" ElementType ctx [LBRACK]
  3922. {
  3923. if p.peek(1) != ELLIPSIS {
  3924. goto _3
  3925. }
  3926. ix := p.ix
  3927. // *ebnf.Token "[" ctx [LBRACK]
  3928. lbrackTok = p.expect(LBRACK)
  3929. // *ebnf.Token "..." ctx [ELLIPSIS]
  3930. ellipsisTok = p.expect(ELLIPSIS)
  3931. // *ebnf.Token "]" ctx []
  3932. if rbrackTok, ok = p.accept(RBRACK); !ok {
  3933. p.back(ix)
  3934. goto _3
  3935. }
  3936. // *ebnf.Name ElementType ctx []
  3937. switch p.c() {
  3938. case ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT:
  3939. if elementType = p.type1(); elementType == nil {
  3940. p.back(ix)
  3941. goto _3
  3942. }
  3943. default:
  3944. p.back(ix)
  3945. goto _3
  3946. }
  3947. }
  3948. return &ArrayLiteralTypeNode{
  3949. LBRACK: lbrackTok,
  3950. ELLIPSIS: ellipsisTok,
  3951. RBRACK: rbrackTok,
  3952. ElementType: elementType,
  3953. }
  3954. _3:
  3955. elementType = nil
  3956. ellipsisTok = Token{}
  3957. lbrackTok = Token{}
  3958. rbrackTok = Token{}
  3959. // *ebnf.Name SliceType ctx [LBRACK]
  3960. if sliceType = p.sliceType(); sliceType != nil {
  3961. return sliceType
  3962. }
  3963. return nil
  3964. case MAP: // 4
  3965. // *ebnf.Name MapType ctx [MAP]
  3966. if mapType = p.mapType(); mapType != nil {
  3967. return mapType
  3968. }
  3969. }
  3970. return nil
  3971. }
  3972. // KeyedElementListNode represents the production
  3973. //
  3974. // KeyedElementListNode = { KeyedElement "," } .
  3975. type KeyedElementListNode struct {
  3976. KeyedElement Expression
  3977. COMMA Token
  3978. List *KeyedElementListNode
  3979. }
  3980. // Source implements Node.
  3981. func (n *KeyedElementListNode) Source(full bool) string { return nodeSource(n, full) }
  3982. // Position implements Node.
  3983. func (n *KeyedElementListNode) Position() (r token.Position) {
  3984. if n == nil {
  3985. return r
  3986. }
  3987. return n.KeyedElement.Position()
  3988. }
  3989. // LiteralValueNode represents the production
  3990. //
  3991. // LiteralValue = "{" { KeyedElement "," } "}" .
  3992. type LiteralValueNode struct {
  3993. LBRACE Token
  3994. KeyedElementList *KeyedElementListNode
  3995. RBRACE Token
  3996. }
  3997. // Source implements Node.
  3998. func (n *LiteralValueNode) Source(full bool) string { return nodeSource(n, full) }
  3999. // Position implements Node.
  4000. func (n *LiteralValueNode) Position() (r token.Position) {
  4001. if n == nil {
  4002. return r
  4003. }
  4004. return n.LBRACE.Position()
  4005. }
  4006. func (p *parser) literalValue() *LiteralValueNode {
  4007. var (
  4008. ok bool
  4009. lbraceTok Token
  4010. list, last *KeyedElementListNode
  4011. keyedElement Expression
  4012. rbraceTok Token
  4013. )
  4014. // ebnf.Sequence "{" [ ElementList [ "," ] ] "}" ctx [LBRACE]
  4015. ix := p.ix
  4016. // *ebnf.Token "{" ctx [LBRACE]
  4017. lbraceTok = p.expect(LBRACE)
  4018. for {
  4019. // *ebnf.Option [ ElementList [ "," ] ] ctx []
  4020. switch p.c() {
  4021. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  4022. {
  4023. ix := p.ix
  4024. if keyedElement = p.keyedElement(); keyedElement == nil {
  4025. p.back(ix)
  4026. goto _1
  4027. }
  4028. switch p.c() {
  4029. case COMMA:
  4030. // *ebnf.Token "," ctx [COMMA]
  4031. next := &KeyedElementListNode{
  4032. KeyedElement: keyedElement,
  4033. COMMA: p.consume(),
  4034. }
  4035. if last != nil {
  4036. last.List = next
  4037. }
  4038. if list == nil {
  4039. list = next
  4040. }
  4041. last = next
  4042. continue
  4043. case RBRACE:
  4044. next := &KeyedElementListNode{
  4045. KeyedElement: keyedElement,
  4046. }
  4047. if last != nil {
  4048. last.List = next
  4049. }
  4050. if list == nil {
  4051. list = next
  4052. }
  4053. last = next
  4054. }
  4055. }
  4056. }
  4057. goto _1
  4058. }
  4059. _1:
  4060. // *ebnf.Token "}" ctx []
  4061. if rbraceTok, ok = p.accept(RBRACE); !ok {
  4062. p.back(ix)
  4063. return nil
  4064. }
  4065. return &LiteralValueNode{
  4066. LBRACE: lbraceTok,
  4067. KeyedElementList: list,
  4068. RBRACE: rbraceTok,
  4069. }
  4070. }
  4071. func (p *parser) logicalAndExpression(preBlock bool) (r Expression) {
  4072. var relationalExpression Expression
  4073. // ebnf.Sequence RelationalExpression { "&&" RelationalExpression } ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  4074. {
  4075. ix := p.ix
  4076. // *ebnf.Name RelationalExpression ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  4077. if relationalExpression = p.relationalExpression(preBlock); relationalExpression == nil {
  4078. p.back(ix)
  4079. return nil
  4080. }
  4081. r = relationalExpression
  4082. // *ebnf.Repetition { "&&" RelationalExpression } ctx []
  4083. _0:
  4084. {
  4085. var landTok Token
  4086. var relationalExpression Expression
  4087. switch p.c() {
  4088. case LAND:
  4089. // ebnf.Sequence "&&" RelationalExpression ctx [LAND]
  4090. switch p.peek(1) {
  4091. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  4092. default:
  4093. goto _1
  4094. }
  4095. ix := p.ix
  4096. // *ebnf.Token "&&" ctx [LAND]
  4097. landTok = p.expect(LAND)
  4098. // *ebnf.Name RelationalExpression ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  4099. if relationalExpression = p.relationalExpression(preBlock); relationalExpression == nil {
  4100. p.back(ix)
  4101. goto _1
  4102. }
  4103. r = &BinaryExpressionNode{LHS: r, Op: landTok, RHS: relationalExpression}
  4104. goto _0
  4105. }
  4106. _1:
  4107. }
  4108. }
  4109. return r
  4110. }
  4111. // MapTypeNode represents the production
  4112. //
  4113. // MapType = "map" "[" KeyType "]" ElementType .
  4114. type MapTypeNode struct {
  4115. MAP Token
  4116. LBRACK Token
  4117. KeyType Node
  4118. RBRACK Token
  4119. ElementType Node
  4120. }
  4121. // Source implements Node.
  4122. func (n *MapTypeNode) Source(full bool) string { return nodeSource(n, full) }
  4123. // Position implements Node.
  4124. func (n *MapTypeNode) Position() (r token.Position) {
  4125. if n == nil {
  4126. return r
  4127. }
  4128. return n.MAP.Position()
  4129. }
  4130. func (p *parser) mapType() *MapTypeNode {
  4131. var (
  4132. ok bool
  4133. mapTok Token
  4134. lbrackTok Token
  4135. keyType Node
  4136. rbrackTok Token
  4137. elementType Node
  4138. )
  4139. // ebnf.Sequence "map" "[" KeyType "]" ElementType ctx [MAP]
  4140. {
  4141. if p.peek(1) != LBRACK {
  4142. return nil
  4143. }
  4144. ix := p.ix
  4145. // *ebnf.Token "map" ctx [MAP]
  4146. mapTok = p.expect(MAP)
  4147. // *ebnf.Token "[" ctx [LBRACK]
  4148. lbrackTok = p.expect(LBRACK)
  4149. // *ebnf.Name KeyType ctx []
  4150. switch p.c() {
  4151. case ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT:
  4152. if keyType = p.type1(); keyType == nil {
  4153. p.back(ix)
  4154. return nil
  4155. }
  4156. default:
  4157. p.back(ix)
  4158. return nil
  4159. }
  4160. // *ebnf.Token "]" ctx []
  4161. if rbrackTok, ok = p.accept(RBRACK); !ok {
  4162. p.back(ix)
  4163. return nil
  4164. }
  4165. // *ebnf.Name ElementType ctx []
  4166. switch p.c() {
  4167. case ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT:
  4168. if elementType = p.type1(); elementType == nil {
  4169. p.back(ix)
  4170. return nil
  4171. }
  4172. default:
  4173. p.back(ix)
  4174. return nil
  4175. }
  4176. }
  4177. return &MapTypeNode{
  4178. MAP: mapTok,
  4179. LBRACK: lbrackTok,
  4180. KeyType: keyType,
  4181. RBRACK: rbrackTok,
  4182. ElementType: elementType,
  4183. }
  4184. }
  4185. // MethodDeclNode represents the production
  4186. //
  4187. // MethodDecl = "func" Receiver MethodName Signature [ FunctionBody ] .
  4188. type MethodDeclNode struct {
  4189. FUNC Token
  4190. Receiver *ParametersNode
  4191. MethodName Token
  4192. Signature *SignatureNode
  4193. FunctionBody *FunctionBodyNode
  4194. }
  4195. // Source implements Node.
  4196. func (n *MethodDeclNode) Source(full bool) string { return nodeSource(n, full) }
  4197. // Position implements Node.
  4198. func (n *MethodDeclNode) Position() (r token.Position) {
  4199. if n == nil {
  4200. return r
  4201. }
  4202. return n.FUNC.Position()
  4203. }
  4204. func (p *parser) methodDecl() *MethodDeclNode {
  4205. var (
  4206. funcTok Token
  4207. receiver *ParametersNode
  4208. methodName Token
  4209. signature *SignatureNode
  4210. functionBody *FunctionBodyNode
  4211. )
  4212. // ebnf.Sequence "func" Receiver MethodName Signature [ FunctionBody ] ctx [FUNC]
  4213. {
  4214. switch p.peek(1) {
  4215. case LPAREN:
  4216. default:
  4217. return nil
  4218. }
  4219. ix := p.ix
  4220. // *ebnf.Token "func" ctx [FUNC]
  4221. funcTok = p.expect(FUNC)
  4222. // *ebnf.Name Receiver ctx [LPAREN]
  4223. if receiver = p.receiver(); receiver == nil {
  4224. p.back(ix)
  4225. return nil
  4226. }
  4227. // *ebnf.Name MethodName ctx []
  4228. switch p.c() {
  4229. case IDENT:
  4230. if methodName = p.methodName(); !methodName.IsValid() {
  4231. p.back(ix)
  4232. return nil
  4233. }
  4234. default:
  4235. p.back(ix)
  4236. return nil
  4237. }
  4238. // *ebnf.Name Signature ctx []
  4239. switch p.c() {
  4240. case LPAREN:
  4241. if signature = p.signature(); signature == nil {
  4242. p.back(ix)
  4243. return nil
  4244. }
  4245. default:
  4246. p.back(ix)
  4247. return nil
  4248. }
  4249. // *ebnf.Option [ FunctionBody ] ctx []
  4250. switch p.c() {
  4251. case LBRACE:
  4252. // *ebnf.Name FunctionBody ctx [LBRACE]
  4253. if functionBody = p.functionBody(receiver, signature); functionBody == nil {
  4254. goto _0
  4255. }
  4256. }
  4257. goto _1
  4258. _0:
  4259. functionBody = nil
  4260. _1:
  4261. }
  4262. return &MethodDeclNode{
  4263. FUNC: funcTok,
  4264. Receiver: receiver,
  4265. MethodName: methodName,
  4266. Signature: signature,
  4267. FunctionBody: functionBody,
  4268. }
  4269. }
  4270. // MethodElemNode represents the production
  4271. //
  4272. // MethodElem = MethodName Signature .
  4273. type MethodElemNode struct {
  4274. MethodName Token
  4275. Signature *SignatureNode
  4276. typ Type
  4277. }
  4278. // Source implements Node.
  4279. func (n *MethodElemNode) Source(full bool) string { return nodeSource(n, full) }
  4280. // Position implements Node.
  4281. func (n *MethodElemNode) Position() (r token.Position) {
  4282. if n == nil {
  4283. return r
  4284. }
  4285. return n.MethodName.Position()
  4286. }
  4287. func (p *parser) methodElem() *MethodElemNode {
  4288. var (
  4289. methodName Token
  4290. signature *SignatureNode
  4291. )
  4292. // ebnf.Sequence MethodName Signature ctx [IDENT]
  4293. {
  4294. switch p.peek(1) {
  4295. case LPAREN:
  4296. default:
  4297. return nil
  4298. }
  4299. ix := p.ix
  4300. // *ebnf.Name MethodName ctx [IDENT]
  4301. if methodName = p.methodName(); !methodName.IsValid() {
  4302. p.back(ix)
  4303. return nil
  4304. }
  4305. // *ebnf.Name Signature ctx [LPAREN]
  4306. if signature = p.signature(); signature == nil {
  4307. p.back(ix)
  4308. return nil
  4309. }
  4310. }
  4311. return &MethodElemNode{
  4312. MethodName: methodName,
  4313. Signature: signature,
  4314. }
  4315. }
  4316. // MethodExprNode represents the production
  4317. //
  4318. // MethodExpr = ReceiverType "." MethodName .
  4319. type MethodExprNode struct {
  4320. ReceiverType Node
  4321. PERIOD Token
  4322. MethodName Token
  4323. }
  4324. // Source implements Node.
  4325. func (n *MethodExprNode) Source(full bool) string { return nodeSource(n, full) }
  4326. // Position implements Node.
  4327. func (n *MethodExprNode) Position() (r token.Position) {
  4328. if n == nil {
  4329. return r
  4330. }
  4331. return n.ReceiverType.Position()
  4332. }
  4333. func (p *parser) methodExpr() *MethodExprNode {
  4334. var (
  4335. ok bool
  4336. receiverType Node
  4337. periodTok Token
  4338. methodName Token
  4339. )
  4340. // ebnf.Sequence ReceiverType "." MethodName ctx [ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT]
  4341. {
  4342. ix := p.ix
  4343. // *ebnf.Name ReceiverType ctx [ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT]
  4344. if receiverType = p.type1(); receiverType == nil {
  4345. p.back(ix)
  4346. return nil
  4347. }
  4348. // *ebnf.Token "." ctx []
  4349. if periodTok, ok = p.accept(PERIOD); !ok {
  4350. p.back(ix)
  4351. return nil
  4352. }
  4353. // *ebnf.Name MethodName ctx []
  4354. switch p.c() {
  4355. case IDENT:
  4356. if methodName = p.methodName(); !methodName.IsValid() {
  4357. p.back(ix)
  4358. return nil
  4359. }
  4360. default:
  4361. p.back(ix)
  4362. return nil
  4363. }
  4364. }
  4365. return &MethodExprNode{
  4366. ReceiverType: receiverType,
  4367. PERIOD: periodTok,
  4368. MethodName: methodName,
  4369. }
  4370. }
  4371. func (p *parser) methodName() Token {
  4372. // *ebnf.Name identifier ctx [IDENT]
  4373. return p.expect(IDENT)
  4374. }
  4375. func (p *parser) multiplicativeExpression(preBlock bool) (r Expression) {
  4376. var unaryExpr Expression
  4377. // ebnf.Sequence UnaryExpr { ( "*" | "/" | "%" | "<<" | ">>" | "&" | "&^" ) UnaryExpr } ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  4378. {
  4379. ix := p.ix
  4380. // *ebnf.Name UnaryExpr ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  4381. if unaryExpr = p.unaryExpr(preBlock); unaryExpr == nil {
  4382. p.back(ix)
  4383. return nil
  4384. }
  4385. r = unaryExpr
  4386. // *ebnf.Repetition { ( "*" | "/" | "%" | "<<" | ">>" | "&" | "&^" ) UnaryExpr } ctx []
  4387. _0:
  4388. {
  4389. var op Token
  4390. var unaryExpr Expression
  4391. switch p.c() {
  4392. case AND, AND_NOT, MUL, QUO, REM, SHL, SHR:
  4393. // ebnf.Sequence ( "*" | "/" | "%" | "<<" | ">>" | "&" | "&^" ) UnaryExpr ctx [AND, AND_NOT, MUL, QUO, REM, SHL, SHR]
  4394. // *ebnf.Group ( "*" | "/" | "%" | "<<" | ">>" | "&" | "&^" ) ctx [AND, AND_NOT, MUL, QUO, REM, SHL, SHR]
  4395. // ebnf.Alternative "*" | "/" | "%" | "<<" | ">>" | "&" | "&^" ctx [AND, AND_NOT, MUL, QUO, REM, SHL, SHR]
  4396. op = p.consume()
  4397. // *ebnf.Name UnaryExpr ctx []
  4398. switch p.c() {
  4399. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  4400. if unaryExpr = p.unaryExpr(preBlock); unaryExpr == nil {
  4401. p.back(ix)
  4402. goto _1
  4403. }
  4404. default:
  4405. p.back(ix)
  4406. goto _1
  4407. }
  4408. r = &BinaryExpressionNode{LHS: r, Op: op, RHS: unaryExpr}
  4409. goto _0
  4410. }
  4411. _1:
  4412. }
  4413. }
  4414. return r
  4415. }
  4416. // OperandNode represents the production
  4417. //
  4418. // Operand = Literal | OperandName [ TypeArgs ] [ LiteralValue ] .
  4419. type OperandNode struct {
  4420. OperandName Expression
  4421. TypeArgs *TypeArgsNode
  4422. LiteralValue *LiteralValueNode
  4423. }
  4424. // Source implements Node.
  4425. func (n *OperandNode) Source(full bool) string { return nodeSource(n, full) }
  4426. // Position implements Node.
  4427. func (n *OperandNode) Position() (r token.Position) {
  4428. if n == nil {
  4429. return r
  4430. }
  4431. return n.OperandName.Position()
  4432. }
  4433. type ParenthesizedExpressionNode struct {
  4434. LPAREN Token
  4435. Expression Expression
  4436. RPAREN Token
  4437. }
  4438. // Source implements Node.
  4439. func (n *ParenthesizedExpressionNode) Source(full bool) string { return nodeSource(n, full) }
  4440. // Position implements Node.
  4441. func (n *ParenthesizedExpressionNode) Position() (r token.Position) {
  4442. if n == nil {
  4443. return r
  4444. }
  4445. return n.LPAREN.Position()
  4446. }
  4447. func (p *parser) operand(preBlock bool) Expression {
  4448. var (
  4449. ok bool
  4450. literal Expression
  4451. operandName Expression
  4452. typeArgs *TypeArgsNode
  4453. literalValue *LiteralValueNode
  4454. lparenTok Token
  4455. expression Expression
  4456. rparenTok Token
  4457. )
  4458. // ebnf.Alternative Literal | OperandName [ TypeArgs ] [ LiteralValue ] | "(" Expression ")" ctx [CHAR, FLOAT, FUNC, IDENT, IMAG, INT, LBRACK, LPAREN, MAP, STRING, STRUCT]
  4459. switch p.c() {
  4460. case CHAR, FLOAT, FUNC, IMAG, INT, LBRACK, MAP, STRING, STRUCT: // 0
  4461. // *ebnf.Name Literal ctx [CHAR, FLOAT, FUNC, IMAG, INT, LBRACK, MAP, STRING, STRUCT]
  4462. if literal = p.literal(); literal == nil {
  4463. return nil
  4464. }
  4465. return literal
  4466. case IDENT: // 1
  4467. // ebnf.Sequence OperandName [ TypeArgs ] [ LiteralValue ] ctx [IDENT]
  4468. {
  4469. ix := p.ix
  4470. // *ebnf.Name OperandName ctx [IDENT]
  4471. if operandName = p.operandName(); operandName == nil {
  4472. p.back(ix)
  4473. goto _2
  4474. }
  4475. // *ebnf.Option [ TypeArgs ] ctx []
  4476. switch p.c() {
  4477. case LBRACK:
  4478. // *ebnf.Name TypeArgs ctx [LBRACK]
  4479. if typeArgs = p.typeArgs(); typeArgs == nil {
  4480. goto _4
  4481. }
  4482. }
  4483. goto _5
  4484. _4:
  4485. typeArgs = nil
  4486. _5:
  4487. if !preBlock {
  4488. // *ebnf.Option [ LiteralValue ] ctx []
  4489. switch p.c() {
  4490. case LBRACE:
  4491. // *ebnf.Name LiteralValue ctx [LBRACE]
  4492. if literalValue = p.literalValue(); literalValue == nil {
  4493. goto _6
  4494. }
  4495. }
  4496. goto _7
  4497. _6:
  4498. literalValue = nil
  4499. _7:
  4500. }
  4501. }
  4502. break
  4503. _2:
  4504. literalValue = nil
  4505. operandName = nil
  4506. typeArgs = nil
  4507. return nil
  4508. case LPAREN: // 2
  4509. // ebnf.Sequence "(" Expression ")" ctx [LPAREN]
  4510. {
  4511. switch p.peek(1) {
  4512. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  4513. default:
  4514. goto _8
  4515. }
  4516. ix := p.ix
  4517. // *ebnf.Token "(" ctx [LPAREN]
  4518. lparenTok = p.expect(LPAREN)
  4519. // *ebnf.Name Expression ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  4520. if expression = p.expression(false); expression == nil {
  4521. p.back(ix)
  4522. goto _8
  4523. }
  4524. // *ebnf.Token ")" ctx []
  4525. if rparenTok, ok = p.accept(RPAREN); !ok {
  4526. p.back(ix)
  4527. goto _8
  4528. }
  4529. }
  4530. return &ParenthesizedExpressionNode{LPAREN: lparenTok, Expression: expression, RPAREN: rparenTok}
  4531. _8:
  4532. expression = nil
  4533. lparenTok = Token{}
  4534. rparenTok = Token{}
  4535. return nil
  4536. default:
  4537. return nil
  4538. }
  4539. if operandName != nil && typeArgs == nil && literalValue == nil {
  4540. return operandName
  4541. }
  4542. return &OperandNode{
  4543. OperandName: operandName,
  4544. TypeArgs: typeArgs,
  4545. LiteralValue: literalValue,
  4546. }
  4547. }
  4548. // IotaNode represents the production
  4549. //
  4550. // IotaNode = identifier .
  4551. type IotaNode struct {
  4552. Iota Token
  4553. lexicalScoper
  4554. }
  4555. // Source implements Node.
  4556. func (n *IotaNode) Source(full bool) string { return nodeSource(n, full) }
  4557. // Position implements Node.
  4558. func (n *IotaNode) Position() (r token.Position) {
  4559. if n == nil || !n.Iota.IsValid() {
  4560. return r
  4561. }
  4562. return n.Iota.Position()
  4563. }
  4564. // OperandNameNode represents the production
  4565. //
  4566. // OperandName = identifier .
  4567. type OperandNameNode struct {
  4568. Name Token
  4569. lexicalScoper
  4570. }
  4571. // Source implements Node.
  4572. func (n *OperandNameNode) Source(full bool) string { return nodeSource(n, full) }
  4573. // Position implements Node.
  4574. func (n *OperandNameNode) Position() (r token.Position) {
  4575. if n == nil || !n.Name.IsValid() {
  4576. return r
  4577. }
  4578. return n.Name.Position()
  4579. }
  4580. // OperandQualifiedNameNode represents the production
  4581. //
  4582. // OperandQualifiedName = QualifiedIdent .
  4583. type OperandQualifiedNameNode struct {
  4584. Name *QualifiedIdentNode
  4585. lexicalScoper
  4586. }
  4587. // Source implements Node.
  4588. func (n *OperandQualifiedNameNode) Source(full bool) string { return nodeSource(n, full) }
  4589. // Position implements Node.
  4590. func (n *OperandQualifiedNameNode) Position() (r token.Position) {
  4591. if n == nil || n.Name == nil {
  4592. return r
  4593. }
  4594. return n.Name.Position()
  4595. }
  4596. func (p *parser) operandName() Expression {
  4597. var (
  4598. qualifiedIdent *QualifiedIdentNode
  4599. )
  4600. // ebnf.Alternative QualifiedIdent | identifier ctx [IDENT]
  4601. switch p.c() {
  4602. case IDENT: // 0 1
  4603. // *ebnf.Name QualifiedIdent ctx [IDENT]
  4604. if qualifiedIdent = p.qualifiedIdent(); qualifiedIdent != nil {
  4605. return &OperandQualifiedNameNode{
  4606. Name: qualifiedIdent,
  4607. lexicalScoper: newLexicalScoper(p.sc),
  4608. }
  4609. }
  4610. // *ebnf.Name identifier ctx [IDENT]
  4611. return &OperandNameNode{
  4612. Name: p.expect(IDENT),
  4613. lexicalScoper: newLexicalScoper(p.sc),
  4614. }
  4615. default:
  4616. return nil
  4617. }
  4618. }
  4619. // PackageClauseNode represents the production
  4620. //
  4621. // PackageClause = "package" PackageName .
  4622. type PackageClauseNode struct {
  4623. PACKAGE Token
  4624. PackageName Token
  4625. }
  4626. // Source implements Node.
  4627. func (n *PackageClauseNode) Source(full bool) string { return nodeSource(n, full) }
  4628. // Position implements Node.
  4629. func (n *PackageClauseNode) Position() (r token.Position) {
  4630. if n == nil {
  4631. return r
  4632. }
  4633. return n.PACKAGE.Position()
  4634. }
  4635. func (p *parser) packageClause() *PackageClauseNode {
  4636. var (
  4637. packageTok Token
  4638. packageName Token
  4639. )
  4640. // ebnf.Sequence "package" PackageName ctx [PACKAGE]
  4641. {
  4642. if p.peek(1) != IDENT {
  4643. return nil
  4644. }
  4645. ix := p.ix
  4646. // *ebnf.Token "package" ctx [PACKAGE]
  4647. packageTok = p.expect(PACKAGE)
  4648. // *ebnf.Name PackageName ctx [IDENT]
  4649. if packageName = p.packageName(); !packageName.IsValid() {
  4650. p.back(ix)
  4651. return nil
  4652. }
  4653. }
  4654. return &PackageClauseNode{
  4655. PACKAGE: packageTok,
  4656. PackageName: packageName,
  4657. }
  4658. }
  4659. func (p *parser) packageName() Token {
  4660. // *ebnf.Name identifier ctx [IDENT]
  4661. return p.expect(IDENT)
  4662. }
  4663. // ParameterDeclNode represents the production
  4664. //
  4665. // ParameterDecl = [ IdentifierList ] [ "..." ] Type .
  4666. type ParameterDeclNode struct {
  4667. IdentifierList *IdentifierListNode
  4668. ELLIPSIS Token
  4669. TypeNode Type
  4670. visible
  4671. }
  4672. // Source implements Node.
  4673. func (n *ParameterDeclNode) Source(full bool) string { return nodeSource(n, full) }
  4674. // Position implements Node.
  4675. func (n *ParameterDeclNode) Position() (r token.Position) {
  4676. if n == nil {
  4677. return r
  4678. }
  4679. if n.IdentifierList != nil {
  4680. return n.IdentifierList.Position()
  4681. }
  4682. if n.ELLIPSIS.IsValid() {
  4683. return n.ELLIPSIS.Position()
  4684. }
  4685. return n.TypeNode.Position()
  4686. }
  4687. func (p *parser) parameterDecl() *ParameterDeclNode {
  4688. var (
  4689. identTok Token
  4690. ellipsisTok Token
  4691. typeNode Type
  4692. )
  4693. // ebnf.Alternative identifier "..." Type | identifier Type | "..." Type | Type ctx [ARROW, CHAN, ELLIPSIS, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT]
  4694. switch p.c() {
  4695. case IDENT: // 0 1 3
  4696. // ebnf.Sequence identifier "..." Type ctx [IDENT]
  4697. {
  4698. if p.peek(1) != ELLIPSIS {
  4699. goto _0
  4700. }
  4701. ix := p.ix
  4702. // *ebnf.Name identifier ctx [IDENT]
  4703. identTok = p.expect(IDENT)
  4704. // *ebnf.Token "..." ctx [ELLIPSIS]
  4705. ellipsisTok = p.expect(ELLIPSIS)
  4706. // *ebnf.Name Type ctx []
  4707. switch p.c() {
  4708. case ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT:
  4709. if typeNode = p.type1(); typeNode == nil {
  4710. p.back(ix)
  4711. goto _0
  4712. }
  4713. default:
  4714. p.back(ix)
  4715. goto _0
  4716. }
  4717. }
  4718. break
  4719. _0:
  4720. ellipsisTok = Token{}
  4721. identTok = Token{}
  4722. typeNode = nil
  4723. // ebnf.Sequence identifier Type ctx [IDENT]
  4724. {
  4725. switch p.peek(1) {
  4726. case ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT:
  4727. default:
  4728. goto _1
  4729. }
  4730. ix := p.ix
  4731. // *ebnf.Name identifier ctx [IDENT]
  4732. identTok = p.expect(IDENT)
  4733. // *ebnf.Name Type ctx [ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT]
  4734. if typeNode = p.type1(); typeNode == nil {
  4735. p.back(ix)
  4736. goto _1
  4737. }
  4738. }
  4739. break
  4740. _1:
  4741. identTok = Token{}
  4742. typeNode = nil
  4743. // *ebnf.Name Type ctx [IDENT]
  4744. if typeNode = p.type1(); typeNode == nil {
  4745. goto _2
  4746. }
  4747. break
  4748. _2:
  4749. typeNode = nil
  4750. return nil
  4751. case ELLIPSIS: // 2
  4752. // ebnf.Sequence "..." Type ctx [ELLIPSIS]
  4753. {
  4754. switch p.peek(1) {
  4755. case ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT:
  4756. default:
  4757. goto _3
  4758. }
  4759. ix := p.ix
  4760. // *ebnf.Token "..." ctx [ELLIPSIS]
  4761. ellipsisTok = p.expect(ELLIPSIS)
  4762. // *ebnf.Name Type ctx [ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT]
  4763. if typeNode = p.type1(); typeNode == nil {
  4764. p.back(ix)
  4765. goto _3
  4766. }
  4767. }
  4768. break
  4769. _3:
  4770. ellipsisTok = Token{}
  4771. typeNode = nil
  4772. return nil
  4773. case ARROW, CHAN, FUNC, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT: // 3
  4774. // *ebnf.Name Type ctx [ARROW, CHAN, FUNC, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT]
  4775. if typeNode = p.type1(); typeNode == nil {
  4776. goto _5
  4777. }
  4778. break
  4779. _5:
  4780. typeNode = nil
  4781. return nil
  4782. default:
  4783. return nil
  4784. }
  4785. var idl *IdentifierListNode
  4786. if identTok.IsValid() {
  4787. idl = &IdentifierListNode{IDENT: identTok}
  4788. }
  4789. return &ParameterDeclNode{
  4790. IdentifierList: idl,
  4791. ELLIPSIS: ellipsisTok,
  4792. TypeNode: typeNode,
  4793. }
  4794. }
  4795. // ParameterDeclListNode represents the production
  4796. //
  4797. // ParameterDeclListNode = { ParameterDecl "," } .
  4798. type ParameterDeclListNode struct {
  4799. ParameterDecl *ParameterDeclNode
  4800. COMMA Token
  4801. List *ParameterDeclListNode
  4802. }
  4803. // Source implements Node.
  4804. func (n *ParameterDeclListNode) Source(full bool) string { return nodeSource(n, full) }
  4805. // Position implements Node.
  4806. func (n *ParameterDeclListNode) Position() (r token.Position) {
  4807. if n == nil {
  4808. return r
  4809. }
  4810. return n.ParameterDecl.Position()
  4811. }
  4812. // ParametersNode represents the production
  4813. //
  4814. // Parameters = "(" { ParameterDecl "," } ")" .
  4815. type ParametersNode struct {
  4816. LPAREN Token
  4817. ParameterDeclList *ParameterDeclListNode
  4818. RPAREN Token
  4819. }
  4820. // Source implements Node.
  4821. func (n *ParametersNode) Source(full bool) string { return nodeSource(n, full) }
  4822. // Position implements Node.
  4823. func (n *ParametersNode) Position() (r token.Position) {
  4824. if n == nil {
  4825. return r
  4826. }
  4827. return n.LPAREN.Position()
  4828. }
  4829. func (p *parser) parameters() (r *ParametersNode) {
  4830. var (
  4831. ok bool
  4832. lparenTok Token
  4833. parameterDecl *ParameterDeclNode
  4834. list0 []*ParameterDeclListNode
  4835. list, last *ParameterDeclListNode
  4836. rparenTok Token
  4837. )
  4838. ix := p.ix
  4839. // *ebnf.Token "(" ctx [LPAREN]
  4840. lparenTok = p.expect(LPAREN)
  4841. for {
  4842. // *ebnf.Option [ ParameterList [ "," ] ] ctx []
  4843. switch p.c() {
  4844. case ARROW, CHAN, ELLIPSIS, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT:
  4845. // ebnf.Sequence ParameterList [ "," ] ctx [ARROW, CHAN, ELLIPSIS, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT]
  4846. {
  4847. ix := p.ix
  4848. if parameterDecl = p.parameterDecl(); parameterDecl == nil {
  4849. p.back(ix)
  4850. goto _1
  4851. }
  4852. // *ebnf.Option [ "," ] ctx []
  4853. switch p.c() {
  4854. case COMMA:
  4855. // *ebnf.Token "," ctx [COMMA]
  4856. next := &ParameterDeclListNode{
  4857. ParameterDecl: parameterDecl,
  4858. COMMA: p.consume(),
  4859. }
  4860. list0 = append(list0, next)
  4861. if last != nil {
  4862. last.List = next
  4863. }
  4864. if list == nil {
  4865. list = next
  4866. }
  4867. last = next
  4868. continue
  4869. case RPAREN:
  4870. next := &ParameterDeclListNode{
  4871. ParameterDecl: parameterDecl,
  4872. }
  4873. list0 = append(list0, next)
  4874. if last != nil {
  4875. last.List = next
  4876. }
  4877. if list == nil {
  4878. list = next
  4879. }
  4880. last = next
  4881. }
  4882. }
  4883. }
  4884. goto _1
  4885. }
  4886. _1:
  4887. // *ebnf.Token ")" ctx []
  4888. if rparenTok, ok = p.accept(RPAREN); !ok {
  4889. p.back(ix)
  4890. return nil
  4891. }
  4892. var ids []int
  4893. for i, v := range list0 {
  4894. if v.ParameterDecl.IdentifierList != nil {
  4895. ids = append(ids, i)
  4896. }
  4897. }
  4898. r = &ParametersNode{
  4899. LPAREN: lparenTok,
  4900. ParameterDeclList: list,
  4901. RPAREN: rparenTok,
  4902. }
  4903. if len(ids) != 0 && len(ids) != len(list0) {
  4904. // len(ids)
  4905. // | ids
  4906. // | | len(list0)
  4907. // TODO gc.go:74:20 (rel, importPath, version string) 1 [2] 3
  4908. last = nil
  4909. for _, v := range list0 {
  4910. x := *v
  4911. x.List = nil
  4912. }
  4913. for firstX := 0; len(ids) != 0; {
  4914. lastX := ids[0]
  4915. ids = ids[1:]
  4916. grp := list0[lastX]
  4917. grp.List = nil
  4918. idl := grp.ParameterDecl.IdentifierList
  4919. for i := lastX - 1; i >= firstX; i-- {
  4920. item := list0[i]
  4921. decl := item.ParameterDecl
  4922. typ := decl.TypeNode
  4923. switch x := typ.(type) {
  4924. case *TypeNode:
  4925. if x.TypeArgs != nil {
  4926. panic(todo("%v: %s", decl.Position(), decl.Source(false)))
  4927. }
  4928. if x.TypeName == nil {
  4929. p.err(x.Position(), "syntax error: mixed named and unnamed parameters")
  4930. continue
  4931. }
  4932. switch y := x.TypeName.Name.(type) {
  4933. case Token:
  4934. // { param , } vs { , ident }
  4935. idl.COMMA = item.COMMA
  4936. li := &IdentifierListNode{IDENT: y}
  4937. li.List = idl
  4938. idl = li
  4939. default:
  4940. p.err(y.Position(), "syntax error: mixed named and unnamed parameters")
  4941. }
  4942. case *TypeNameNode:
  4943. switch y := x.Name.(type) {
  4944. case Token:
  4945. // { param , } vs { , ident }
  4946. idl.COMMA = item.COMMA
  4947. li := &IdentifierListNode{IDENT: y}
  4948. li.List = idl
  4949. idl = li
  4950. default:
  4951. p.err(y.Position(), "syntax error: mixed named and unnamed parameters")
  4952. }
  4953. default:
  4954. p.err(x.Position(), "syntax error: mixed named and unnamed parameters")
  4955. }
  4956. }
  4957. grp.ParameterDecl.IdentifierList = idl
  4958. firstX = lastX + 1
  4959. if last == nil {
  4960. r.ParameterDeclList = grp
  4961. last = grp
  4962. continue
  4963. }
  4964. last.List = grp
  4965. last = grp
  4966. }
  4967. }
  4968. return r
  4969. }
  4970. func (n *ParametersNode) declare(p *parser, s *Scope) {
  4971. if n == nil {
  4972. return
  4973. }
  4974. for l := n.ParameterDeclList; l != nil; l = l.List {
  4975. pd := l.ParameterDecl
  4976. for l := pd.IdentifierList; l != nil; l = l.List {
  4977. p.declare(s, l.IDENT, pd, 0, true)
  4978. }
  4979. }
  4980. }
  4981. // PointerTypeNode represents the production
  4982. //
  4983. // PointerType = "*" BaseType .
  4984. type PointerTypeNode struct {
  4985. MUL Token
  4986. BaseType Type
  4987. guard
  4988. }
  4989. // Source implements Node.
  4990. func (n *PointerTypeNode) Source(full bool) string { return nodeSource(n, full) }
  4991. // Position implements Node.
  4992. func (n *PointerTypeNode) Position() (r token.Position) {
  4993. if n == nil {
  4994. return r
  4995. }
  4996. return n.MUL.Position()
  4997. }
  4998. func (p *parser) pointerType() *PointerTypeNode {
  4999. var (
  5000. mulTok Token
  5001. baseType Type
  5002. )
  5003. // ebnf.Sequence "*" BaseType ctx [MUL]
  5004. {
  5005. switch p.peek(1) {
  5006. case ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT:
  5007. default:
  5008. return nil
  5009. }
  5010. ix := p.ix
  5011. // *ebnf.Token "*" ctx [MUL]
  5012. mulTok = p.expect(MUL)
  5013. // *ebnf.Name BaseType ctx [ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT]
  5014. if baseType = p.type1(); baseType == nil {
  5015. p.back(ix)
  5016. return nil
  5017. }
  5018. }
  5019. return &PointerTypeNode{
  5020. MUL: mulTok,
  5021. BaseType: baseType,
  5022. }
  5023. }
  5024. func (p *parser) postStmt() Node {
  5025. // *ebnf.Name SimpleStmt ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR /* ε */]
  5026. return p.simpleStmt(true)
  5027. }
  5028. // PrimaryExprNode represents the production
  5029. //
  5030. // PrimaryExpr = Operand | Conversion | MethodExpr { Selector | Index | Slice | TypeAssertion | Arguments } .
  5031. type PrimaryExprNode struct {
  5032. PrimaryExpr Expression
  5033. Postfix Node
  5034. }
  5035. // Source implements Node.
  5036. func (n *PrimaryExprNode) Source(full bool) string { return nodeSource(n, full) }
  5037. // Position implements Node.
  5038. func (n *PrimaryExprNode) Position() (r token.Position) {
  5039. if n == nil {
  5040. return r
  5041. }
  5042. return n.PrimaryExpr.Position()
  5043. }
  5044. func (p *parser) primaryExpr(preBlock bool) (r Expression) {
  5045. var (
  5046. item0 Expression
  5047. operand Expression
  5048. conversion *ConversionNode
  5049. methodExpr *MethodExprNode
  5050. list []Node
  5051. )
  5052. // ebnf.Sequence ( Operand | Conversion | MethodExpr ) { Selector | Index | Slice | TypeAssertion | Arguments } ctx [ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRING, STRUCT]
  5053. {
  5054. ix := p.ix
  5055. // *ebnf.Group ( Operand | Conversion | MethodExpr ) ctx [ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRING, STRUCT]
  5056. // ebnf.Alternative Operand | Conversion | MethodExpr ctx [ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRING, STRUCT]
  5057. switch p.c() {
  5058. case CHAR, FLOAT, IMAG, INT, STRING: // 0
  5059. // *ebnf.Name Operand ctx [CHAR, FLOAT, IMAG, INT, STRING]
  5060. if operand = p.operand(preBlock); operand == nil {
  5061. goto _0
  5062. }
  5063. item0 = operand
  5064. break
  5065. _0:
  5066. operand = nil
  5067. p.back(ix)
  5068. return nil
  5069. case FUNC, IDENT, LBRACK, LPAREN, MAP, STRUCT: // 0 1 2
  5070. // *ebnf.Name Operand ctx [FUNC, IDENT, LBRACK, LPAREN, MAP, STRUCT]
  5071. if operand = p.operand(preBlock); operand == nil {
  5072. goto _2
  5073. }
  5074. item0 = operand
  5075. break
  5076. _2:
  5077. operand = nil
  5078. // *ebnf.Name Conversion ctx [FUNC, IDENT, LBRACK, LPAREN, MAP, STRUCT]
  5079. if conversion = p.conversion(); conversion == nil {
  5080. goto _3
  5081. }
  5082. item0 = conversion
  5083. break
  5084. _3:
  5085. conversion = nil
  5086. // *ebnf.Name MethodExpr ctx [FUNC, IDENT, LBRACK, LPAREN, MAP, STRUCT]
  5087. if methodExpr = p.methodExpr(); methodExpr == nil {
  5088. goto _4
  5089. }
  5090. item0 = methodExpr
  5091. break
  5092. _4:
  5093. methodExpr = nil
  5094. p.back(ix)
  5095. return nil
  5096. case ARROW, CHAN, INTERFACE, MUL: // 1 2
  5097. // *ebnf.Name Conversion ctx [ARROW, CHAN, INTERFACE, MUL]
  5098. if conversion = p.conversion(); conversion == nil {
  5099. goto _5
  5100. }
  5101. item0 = conversion
  5102. break
  5103. _5:
  5104. conversion = nil
  5105. // *ebnf.Name MethodExpr ctx [ARROW, CHAN, INTERFACE, MUL]
  5106. if methodExpr = p.methodExpr(); methodExpr == nil {
  5107. goto _6
  5108. }
  5109. item0 = methodExpr
  5110. break
  5111. _6:
  5112. methodExpr = nil
  5113. p.back(ix)
  5114. return nil
  5115. default:
  5116. p.back(ix)
  5117. return nil
  5118. }
  5119. r = item0
  5120. // *ebnf.Repetition { Selector | Index | Slice | TypeAssertion | Arguments } ctx []
  5121. _7:
  5122. {
  5123. var item Node
  5124. var selector *SelectorNode
  5125. var index *IndexNode
  5126. var slice *SliceNode
  5127. var typeAssertion *TypeAssertionNode
  5128. var arguments Node
  5129. switch p.c() {
  5130. case LBRACK, LPAREN, PERIOD:
  5131. // ebnf.Alternative Selector | Index | Slice | TypeAssertion | Arguments ctx [LBRACK, LPAREN, PERIOD]
  5132. switch p.c() {
  5133. case PERIOD: // 0 3
  5134. // *ebnf.Name Selector ctx [PERIOD]
  5135. if selector = p.selector(); selector == nil {
  5136. goto _9
  5137. }
  5138. item = selector
  5139. break
  5140. _9:
  5141. // *ebnf.Name TypeAssertion ctx [PERIOD]
  5142. if typeAssertion = p.typeAssertion(); typeAssertion == nil {
  5143. goto _10
  5144. }
  5145. item = typeAssertion
  5146. break
  5147. _10:
  5148. goto _8
  5149. case LBRACK: // 1 2
  5150. // *ebnf.Name Index ctx [LBRACK]
  5151. if index = p.index(); index == nil {
  5152. goto _11
  5153. }
  5154. item = index
  5155. break
  5156. _11:
  5157. // *ebnf.Name Slice ctx [LBRACK]
  5158. if slice = p.slice(); slice == nil {
  5159. goto _12
  5160. }
  5161. item = slice
  5162. break
  5163. _12:
  5164. goto _8
  5165. case LPAREN: // 4
  5166. // *ebnf.Name Arguments ctx [LPAREN]
  5167. if arguments = p.arguments(); arguments == nil {
  5168. goto _13
  5169. }
  5170. item = arguments
  5171. break
  5172. _13:
  5173. goto _8
  5174. default:
  5175. goto _8
  5176. }
  5177. list = append(list, item)
  5178. r = &PrimaryExprNode{PrimaryExpr: r, Postfix: item}
  5179. goto _7
  5180. }
  5181. _8:
  5182. }
  5183. }
  5184. return r
  5185. }
  5186. // QualifiedIdentNode represents the production
  5187. //
  5188. // QualifiedIdent = PackageName "." identifier .
  5189. type QualifiedIdentNode struct {
  5190. PackageName Token
  5191. PERIOD Token
  5192. IDENT Token
  5193. }
  5194. // Source implements Node.
  5195. func (n *QualifiedIdentNode) Source(full bool) string { return nodeSource(n, full) }
  5196. // Position implements Node.
  5197. func (n *QualifiedIdentNode) Position() (r token.Position) {
  5198. if n == nil {
  5199. return r
  5200. }
  5201. return n.PackageName.Position()
  5202. }
  5203. func (p *parser) qualifiedIdent() *QualifiedIdentNode {
  5204. var (
  5205. ok bool
  5206. packageName Token
  5207. periodTok Token
  5208. identTok Token
  5209. )
  5210. // ebnf.Sequence PackageName "." identifier ctx [IDENT]
  5211. {
  5212. if p.peek(1) != PERIOD {
  5213. return nil
  5214. }
  5215. ix := p.ix
  5216. // *ebnf.Name PackageName ctx [IDENT]
  5217. if packageName = p.packageName(); !packageName.IsValid() {
  5218. p.back(ix)
  5219. return nil
  5220. }
  5221. // *ebnf.Token "." ctx [PERIOD]
  5222. periodTok = p.expect(PERIOD)
  5223. // *ebnf.Name identifier ctx []
  5224. if identTok, ok = p.accept(IDENT); !ok {
  5225. p.back(ix)
  5226. return nil
  5227. }
  5228. }
  5229. return &QualifiedIdentNode{
  5230. PackageName: packageName,
  5231. PERIOD: periodTok,
  5232. IDENT: identTok,
  5233. }
  5234. }
  5235. // RangeClauseNode represents the production
  5236. //
  5237. // RangeClause = "range" Expression | ExpressionList "=" "range" Expression | IdentifierList ":=" "range" Expression .
  5238. type RangeClauseNode struct {
  5239. RANGE Token
  5240. Expression Expression
  5241. ExpressionList *ExpressionListNode
  5242. ASSIGN Token
  5243. IdentifierList *IdentifierListNode
  5244. DEFINE Token
  5245. }
  5246. // Source implements Node.
  5247. func (n *RangeClauseNode) Source(full bool) string { return nodeSource(n, full) }
  5248. // Position implements Node.
  5249. func (n *RangeClauseNode) Position() (r token.Position) {
  5250. if n == nil {
  5251. return r
  5252. }
  5253. panic("TODO")
  5254. }
  5255. func (p *parser) rangeClause() *RangeClauseNode {
  5256. var (
  5257. ok bool
  5258. rangeTok Token
  5259. expression Expression
  5260. expressionList *ExpressionListNode
  5261. assignTok Token
  5262. identifierList *IdentifierListNode
  5263. defineTok Token
  5264. )
  5265. // ebnf.Alternative "range" Expression | ExpressionList "=" "range" Expression | IdentifierList ":=" "range" Expression ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, RANGE, STRING, STRUCT, SUB, XOR]
  5266. switch p.c() {
  5267. case RANGE: // 0
  5268. // ebnf.Sequence "range" Expression ctx [RANGE]
  5269. {
  5270. switch p.peek(1) {
  5271. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  5272. default:
  5273. goto _0
  5274. }
  5275. ix := p.ix
  5276. // *ebnf.Token "range" ctx [RANGE]
  5277. rangeTok = p.expect(RANGE)
  5278. // *ebnf.Name Expression ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  5279. if expression = p.expression(true); expression == nil {
  5280. p.back(ix)
  5281. goto _0
  5282. }
  5283. }
  5284. break
  5285. _0:
  5286. expression = nil
  5287. rangeTok = Token{}
  5288. return nil
  5289. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR: // 1
  5290. // ebnf.Sequence ExpressionList "=" "range" Expression ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  5291. {
  5292. ix := p.ix
  5293. // *ebnf.Name ExpressionList ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  5294. if expressionList = p.expressionList(false); expressionList == nil {
  5295. p.back(ix)
  5296. goto _2
  5297. }
  5298. // *ebnf.Token "=" ctx []
  5299. if assignTok, ok = p.accept(ASSIGN); !ok {
  5300. p.back(ix)
  5301. goto _2
  5302. }
  5303. // *ebnf.Token "range" ctx []
  5304. if rangeTok, ok = p.accept(RANGE); !ok {
  5305. p.back(ix)
  5306. goto _2
  5307. }
  5308. // *ebnf.Name Expression ctx []
  5309. switch p.c() {
  5310. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  5311. if expression = p.expression(true); expression == nil {
  5312. p.back(ix)
  5313. goto _2
  5314. }
  5315. default:
  5316. p.back(ix)
  5317. goto _2
  5318. }
  5319. }
  5320. break
  5321. _2:
  5322. assignTok = Token{}
  5323. expressionList = nil
  5324. expression = nil
  5325. rangeTok = Token{}
  5326. return nil
  5327. case IDENT: // 1 2
  5328. // ebnf.Sequence ExpressionList "=" "range" Expression ctx [IDENT]
  5329. {
  5330. ix := p.ix
  5331. // *ebnf.Name ExpressionList ctx [IDENT]
  5332. if expressionList = p.expressionList(false); expressionList == nil {
  5333. p.back(ix)
  5334. goto _4
  5335. }
  5336. // *ebnf.Token "=" ctx []
  5337. if assignTok, ok = p.accept(ASSIGN); !ok {
  5338. p.back(ix)
  5339. goto _4
  5340. }
  5341. // *ebnf.Token "range" ctx []
  5342. if rangeTok, ok = p.accept(RANGE); !ok {
  5343. p.back(ix)
  5344. goto _4
  5345. }
  5346. // *ebnf.Name Expression ctx []
  5347. switch p.c() {
  5348. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  5349. if expression = p.expression(true); expression == nil {
  5350. p.back(ix)
  5351. goto _4
  5352. }
  5353. default:
  5354. p.back(ix)
  5355. goto _4
  5356. }
  5357. }
  5358. break
  5359. _4:
  5360. assignTok = Token{}
  5361. expressionList = nil
  5362. expression = nil
  5363. rangeTok = Token{}
  5364. // ebnf.Sequence IdentifierList ":=" "range" Expression ctx [IDENT]
  5365. {
  5366. ix := p.ix
  5367. // *ebnf.Name IdentifierList ctx [IDENT]
  5368. if identifierList = p.identifierList(); identifierList == nil {
  5369. p.back(ix)
  5370. goto _5
  5371. }
  5372. // *ebnf.Token ":=" ctx []
  5373. if defineTok, ok = p.accept(DEFINE); !ok {
  5374. p.back(ix)
  5375. goto _5
  5376. }
  5377. // *ebnf.Token "range" ctx []
  5378. if rangeTok, ok = p.accept(RANGE); !ok {
  5379. p.back(ix)
  5380. goto _5
  5381. }
  5382. // *ebnf.Name Expression ctx []
  5383. switch p.c() {
  5384. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  5385. if expression = p.expression(true); expression == nil {
  5386. p.back(ix)
  5387. goto _5
  5388. }
  5389. default:
  5390. p.back(ix)
  5391. goto _5
  5392. }
  5393. }
  5394. break
  5395. _5:
  5396. defineTok = Token{}
  5397. expression = nil
  5398. identifierList = nil
  5399. rangeTok = Token{}
  5400. return nil
  5401. default:
  5402. return nil
  5403. }
  5404. return &RangeClauseNode{
  5405. RANGE: rangeTok,
  5406. Expression: expression,
  5407. ExpressionList: expressionList,
  5408. ASSIGN: assignTok,
  5409. IdentifierList: identifierList,
  5410. DEFINE: defineTok,
  5411. }
  5412. }
  5413. func (p *parser) receiver() *ParametersNode {
  5414. // *ebnf.Name Parameters ctx [LPAREN]
  5415. return p.parameters()
  5416. }
  5417. func (p *parser) recvExpr() Expression {
  5418. // *ebnf.Name Expression ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  5419. return p.expression(false)
  5420. }
  5421. // RecvStmtNode represents the production
  5422. //
  5423. // RecvStmt = [ ExpressionList "=" | IdentifierList ":=" ] RecvExpr .
  5424. type RecvStmtNode struct {
  5425. ExpressionList *ExpressionListNode
  5426. Token Token
  5427. IdentifierList *IdentifierListNode
  5428. RecvExpr Expression
  5429. }
  5430. // Source implements Node.
  5431. func (n *RecvStmtNode) Source(full bool) string { return nodeSource(n, full) }
  5432. // Position implements Node.
  5433. func (n *RecvStmtNode) Position() (r token.Position) {
  5434. if n == nil {
  5435. return r
  5436. }
  5437. panic("TODO")
  5438. }
  5439. func (p *parser) recvStmt() *RecvStmtNode {
  5440. var (
  5441. ok bool
  5442. expressionList *ExpressionListNode
  5443. tok Token
  5444. identifierList *IdentifierListNode
  5445. recvExpr Expression
  5446. )
  5447. // ebnf.Sequence [ ExpressionList "=" | IdentifierList ":=" ] RecvExpr ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  5448. {
  5449. ix := p.ix
  5450. // *ebnf.Option [ ExpressionList "=" | IdentifierList ":=" ] ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  5451. // ebnf.Alternative ExpressionList "=" | IdentifierList ":=" ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  5452. switch p.c() {
  5453. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR: // 0
  5454. // ebnf.Sequence ExpressionList "=" ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  5455. {
  5456. ix := p.ix
  5457. // *ebnf.Name ExpressionList ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  5458. if expressionList = p.expressionList(false); expressionList == nil {
  5459. p.back(ix)
  5460. goto _2
  5461. }
  5462. // *ebnf.Token "=" ctx []
  5463. if tok, ok = p.accept(ASSIGN); !ok {
  5464. p.back(ix)
  5465. goto _2
  5466. }
  5467. }
  5468. break
  5469. _2:
  5470. tok = Token{}
  5471. expressionList = nil
  5472. goto _0
  5473. case IDENT: // 0 1
  5474. // ebnf.Sequence ExpressionList "=" ctx [IDENT]
  5475. {
  5476. ix := p.ix
  5477. // *ebnf.Name ExpressionList ctx [IDENT]
  5478. if expressionList = p.expressionList(false); expressionList == nil {
  5479. p.back(ix)
  5480. goto _4
  5481. }
  5482. // *ebnf.Token "=" ctx []
  5483. if tok, ok = p.accept(ASSIGN); !ok {
  5484. p.back(ix)
  5485. goto _4
  5486. }
  5487. }
  5488. break
  5489. _4:
  5490. tok = Token{}
  5491. expressionList = nil
  5492. // ebnf.Sequence IdentifierList ":=" ctx [IDENT]
  5493. {
  5494. ix := p.ix
  5495. // *ebnf.Name IdentifierList ctx [IDENT]
  5496. if identifierList = p.identifierList(); identifierList == nil {
  5497. p.back(ix)
  5498. goto _5
  5499. }
  5500. // *ebnf.Token ":=" ctx []
  5501. if tok, ok = p.accept(DEFINE); !ok {
  5502. p.back(ix)
  5503. goto _5
  5504. }
  5505. }
  5506. break
  5507. _5:
  5508. tok = Token{}
  5509. identifierList = nil
  5510. goto _0
  5511. default:
  5512. goto _0
  5513. }
  5514. goto _1
  5515. _0:
  5516. tok = Token{}
  5517. expressionList = nil
  5518. _1:
  5519. // *ebnf.Name RecvExpr ctx []
  5520. switch p.c() {
  5521. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  5522. if recvExpr = p.recvExpr(); recvExpr == nil {
  5523. p.back(ix)
  5524. return nil
  5525. }
  5526. default:
  5527. p.back(ix)
  5528. return nil
  5529. }
  5530. }
  5531. return &RecvStmtNode{
  5532. ExpressionList: expressionList,
  5533. Token: tok,
  5534. IdentifierList: identifierList,
  5535. RecvExpr: recvExpr,
  5536. }
  5537. }
  5538. func (p *parser) relationalExpression(preBlock bool) (r Expression) {
  5539. var additiveExpression Expression
  5540. // ebnf.Sequence AdditiveExpression { ( "==" | "!=" | "<" | "<=" | ">" | ">=" ) AdditiveExpression } ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  5541. {
  5542. ix := p.ix
  5543. // *ebnf.Name AdditiveExpression ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  5544. if additiveExpression = p.additiveExpression(preBlock); additiveExpression == nil {
  5545. p.back(ix)
  5546. return nil
  5547. }
  5548. r = additiveExpression
  5549. // *ebnf.Repetition { ( "==" | "!=" | "<" | "<=" | ">" | ">=" ) AdditiveExpression } ctx []
  5550. _0:
  5551. {
  5552. var op Token
  5553. var additiveExpression Expression
  5554. switch p.c() {
  5555. case EQL, GEQ, GTR, LEQ, LSS, NEQ:
  5556. // ebnf.Sequence ( "==" | "!=" | "<" | "<=" | ">" | ">=" ) AdditiveExpression ctx [EQL, GEQ, GTR, LEQ, LSS, NEQ]
  5557. // *ebnf.Group ( "==" | "!=" | "<" | "<=" | ">" | ">=" ) ctx [EQL, GEQ, GTR, LEQ, LSS, NEQ]
  5558. // ebnf.Alternative "==" | "!=" | "<" | "<=" | ">" | ">=" ctx [EQL, GEQ, GTR, LEQ, LSS, NEQ]
  5559. op = p.consume()
  5560. // *ebnf.Name AdditiveExpression ctx []
  5561. switch p.c() {
  5562. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  5563. if additiveExpression = p.additiveExpression(preBlock); additiveExpression == nil {
  5564. p.back(ix)
  5565. goto _1
  5566. }
  5567. default:
  5568. p.back(ix)
  5569. goto _1
  5570. }
  5571. r = &BinaryExpressionNode{LHS: r, Op: op, RHS: additiveExpression}
  5572. goto _0
  5573. }
  5574. _1:
  5575. }
  5576. }
  5577. return r
  5578. }
  5579. // ResultNode represents the production
  5580. //
  5581. // Result = Parameters | Type .
  5582. type ResultNode struct {
  5583. Parameters *ParametersNode
  5584. TypeNode Type
  5585. }
  5586. // Source implements Node.
  5587. func (n *ResultNode) Source(full bool) string { return nodeSource(n, full) }
  5588. // Position implements Node.
  5589. func (n *ResultNode) Position() (r token.Position) {
  5590. if n == nil {
  5591. return r
  5592. }
  5593. if n.Parameters != nil {
  5594. return n.Parameters.Position()
  5595. }
  5596. return n.TypeNode.Position()
  5597. }
  5598. func (p *parser) result() *ResultNode {
  5599. var (
  5600. parameters *ParametersNode
  5601. typeNode Type
  5602. )
  5603. // ebnf.Alternative Parameters | Type ctx [ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT]
  5604. switch p.c() {
  5605. case LPAREN: // 0 1
  5606. // *ebnf.Name Parameters ctx [LPAREN]
  5607. if parameters = p.parameters(); parameters == nil {
  5608. goto _0
  5609. }
  5610. break
  5611. _0:
  5612. parameters = nil
  5613. // *ebnf.Name Type ctx [LPAREN]
  5614. if typeNode = p.type1(); typeNode == nil {
  5615. goto _1
  5616. }
  5617. break
  5618. _1:
  5619. typeNode = nil
  5620. return nil
  5621. case ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, MAP, MUL, STRUCT: // 1
  5622. // *ebnf.Name Type ctx [ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, MAP, MUL, STRUCT]
  5623. if typeNode = p.type1(); typeNode == nil {
  5624. goto _2
  5625. }
  5626. break
  5627. _2:
  5628. typeNode = nil
  5629. return nil
  5630. default:
  5631. return nil
  5632. }
  5633. return &ResultNode{
  5634. Parameters: parameters,
  5635. TypeNode: typeNode,
  5636. }
  5637. }
  5638. // ReturnStmtNode represents the production
  5639. //
  5640. // ReturnStmt = "return" [ ExpressionList ] .
  5641. type ReturnStmtNode struct {
  5642. RETURN Token
  5643. ExpressionList *ExpressionListNode
  5644. }
  5645. // Source implements Node.
  5646. func (n *ReturnStmtNode) Source(full bool) string { return nodeSource(n, full) }
  5647. // Position implements Node.
  5648. func (n *ReturnStmtNode) Position() (r token.Position) {
  5649. if n == nil {
  5650. return r
  5651. }
  5652. return n.RETURN.Position()
  5653. }
  5654. func (p *parser) returnStmt() *ReturnStmtNode {
  5655. var (
  5656. returnTok Token
  5657. expressionList *ExpressionListNode
  5658. )
  5659. // ebnf.Sequence "return" [ ExpressionList ] ctx [RETURN]
  5660. {
  5661. // *ebnf.Token "return" ctx [RETURN]
  5662. returnTok = p.expect(RETURN)
  5663. // *ebnf.Option [ ExpressionList ] ctx []
  5664. switch p.c() {
  5665. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  5666. // *ebnf.Name ExpressionList ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  5667. if expressionList = p.expressionList(false); expressionList == nil {
  5668. goto _0
  5669. }
  5670. }
  5671. goto _1
  5672. _0:
  5673. expressionList = nil
  5674. _1:
  5675. }
  5676. return &ReturnStmtNode{
  5677. RETURN: returnTok,
  5678. ExpressionList: expressionList,
  5679. }
  5680. }
  5681. // CommClauseListNode represents the production
  5682. //
  5683. // CommClauseListNode = { CommClause } .
  5684. type CommClauseListNode struct {
  5685. CommClause *CommClauseNode
  5686. List *CommClauseListNode
  5687. }
  5688. // Source implements Node.
  5689. func (n *CommClauseListNode) Source(full bool) string { return nodeSource(n, full) }
  5690. // Position implements Node.
  5691. func (n *CommClauseListNode) Position() (r token.Position) {
  5692. if n == nil {
  5693. return r
  5694. }
  5695. return n.CommClause.Position()
  5696. }
  5697. // SelectStmtNode represents the production
  5698. //
  5699. // SelectStmt = "select" "{" { CommClause } "}" .
  5700. type SelectStmtNode struct {
  5701. SELECT Token
  5702. LBRACE Token
  5703. CommClauseList *CommClauseListNode
  5704. RBRACE Token
  5705. }
  5706. // Source implements Node.
  5707. func (n *SelectStmtNode) Source(full bool) string { return nodeSource(n, full) }
  5708. // Position implements Node.
  5709. func (n *SelectStmtNode) Position() (r token.Position) {
  5710. if n == nil {
  5711. return r
  5712. }
  5713. return n.SELECT.Position()
  5714. }
  5715. func (p *parser) selectStmt() *SelectStmtNode {
  5716. var (
  5717. ok bool
  5718. selectTok Token
  5719. lbraceTok Token
  5720. list, last *CommClauseListNode
  5721. rbraceTok Token
  5722. )
  5723. // ebnf.Sequence "select" "{" { CommClause } "}" ctx [SELECT]
  5724. {
  5725. if p.peek(1) != LBRACE {
  5726. return nil
  5727. }
  5728. ix := p.ix
  5729. // *ebnf.Token "select" ctx [SELECT]
  5730. selectTok = p.expect(SELECT)
  5731. // *ebnf.Token "{" ctx [LBRACE]
  5732. lbraceTok = p.expect(LBRACE)
  5733. // *ebnf.Repetition { CommClause } ctx []
  5734. _0:
  5735. {
  5736. var commClause *CommClauseNode
  5737. switch p.c() {
  5738. case CASE, DEFAULT:
  5739. // *ebnf.Name CommClause ctx [CASE, DEFAULT]
  5740. if commClause = p.commClause(); commClause == nil {
  5741. goto _1
  5742. }
  5743. next := &CommClauseListNode{
  5744. CommClause: commClause,
  5745. }
  5746. if last != nil {
  5747. last.List = next
  5748. }
  5749. if list == nil {
  5750. list = next
  5751. }
  5752. last = next
  5753. goto _0
  5754. }
  5755. _1:
  5756. }
  5757. // *ebnf.Token "}" ctx []
  5758. if rbraceTok, ok = p.accept(RBRACE); !ok {
  5759. p.back(ix)
  5760. return nil
  5761. }
  5762. }
  5763. return &SelectStmtNode{
  5764. SELECT: selectTok,
  5765. LBRACE: lbraceTok,
  5766. CommClauseList: list,
  5767. RBRACE: rbraceTok,
  5768. }
  5769. }
  5770. // SelectorNode represents the production
  5771. //
  5772. // Selector = "." identifier .
  5773. type SelectorNode struct {
  5774. PERIOD Token
  5775. IDENT Token
  5776. }
  5777. // Source implements Node.
  5778. func (n *SelectorNode) Source(full bool) string { return nodeSource(n, full) }
  5779. // Position implements Node.
  5780. func (n *SelectorNode) Position() (r token.Position) {
  5781. if n == nil {
  5782. return r
  5783. }
  5784. return n.PERIOD.Position()
  5785. }
  5786. func (p *parser) selector() *SelectorNode {
  5787. var (
  5788. periodTok Token
  5789. identTok Token
  5790. )
  5791. // ebnf.Sequence "." identifier ctx [PERIOD]
  5792. {
  5793. if p.peek(1) != IDENT {
  5794. return nil
  5795. }
  5796. // *ebnf.Token "." ctx [PERIOD]
  5797. periodTok = p.expect(PERIOD)
  5798. // *ebnf.Name identifier ctx [IDENT]
  5799. identTok = p.expect(IDENT)
  5800. }
  5801. return &SelectorNode{
  5802. PERIOD: periodTok,
  5803. IDENT: identTok,
  5804. }
  5805. }
  5806. // SendStmtNode represents the production
  5807. //
  5808. // SendStmt = Channel "<-" Expression .
  5809. type SendStmtNode struct {
  5810. Channel Expression
  5811. ARROW Token
  5812. Expression Expression
  5813. }
  5814. // Source implements Node.
  5815. func (n *SendStmtNode) Source(full bool) string { return nodeSource(n, full) }
  5816. // Position implements Node.
  5817. func (n *SendStmtNode) Position() (r token.Position) {
  5818. if n == nil {
  5819. return r
  5820. }
  5821. return n.Channel.Position()
  5822. }
  5823. func (p *parser) sendStmt() *SendStmtNode {
  5824. var (
  5825. ok bool
  5826. channel Expression
  5827. arrowTok Token
  5828. expression Expression
  5829. )
  5830. // ebnf.Sequence Channel "<-" Expression ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  5831. {
  5832. ix := p.ix
  5833. // *ebnf.Name Channel ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  5834. if channel = p.channel(); channel == nil {
  5835. p.back(ix)
  5836. return nil
  5837. }
  5838. // *ebnf.Token "<-" ctx []
  5839. if arrowTok, ok = p.accept(ARROW); !ok {
  5840. p.back(ix)
  5841. return nil
  5842. }
  5843. // *ebnf.Name Expression ctx []
  5844. switch p.c() {
  5845. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  5846. if expression = p.expression(false); expression == nil {
  5847. p.back(ix)
  5848. return nil
  5849. }
  5850. default:
  5851. p.back(ix)
  5852. return nil
  5853. }
  5854. }
  5855. return &SendStmtNode{
  5856. Channel: channel,
  5857. ARROW: arrowTok,
  5858. Expression: expression,
  5859. }
  5860. }
  5861. // ShortVarDeclNode represents the production
  5862. //
  5863. // ShortVarDecl = IdentifierList ":=" ExpressionList .
  5864. type ShortVarDeclNode struct {
  5865. IdentifierList *IdentifierListNode
  5866. DEFINE Token
  5867. ExpressionList *ExpressionListNode
  5868. visible
  5869. }
  5870. // Source implements Node.
  5871. func (n *ShortVarDeclNode) Source(full bool) string { return nodeSource(n, full) }
  5872. // Position implements Node.
  5873. func (n *ShortVarDeclNode) Position() (r token.Position) {
  5874. if n == nil {
  5875. return r
  5876. }
  5877. return n.IdentifierList.Position()
  5878. }
  5879. func (p *parser) shortVarDecl(lhs *ExpressionListNode, preBlock bool) (r *ShortVarDeclNode) {
  5880. var (
  5881. defineTok Token
  5882. expressionList *ExpressionListNode
  5883. )
  5884. // ebnf.Sequence ":=" ExpressionList ctx [DEFINE]
  5885. {
  5886. switch p.peek(1) {
  5887. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  5888. default:
  5889. return nil
  5890. }
  5891. ix := p.ix
  5892. // *ebnf.Token ":=" ctx [DEFINE]
  5893. defineTok = p.expect(DEFINE)
  5894. // *ebnf.Name ExpressionList ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  5895. if expressionList = p.expressionList(preBlock); expressionList == nil {
  5896. p.back(ix)
  5897. return nil
  5898. }
  5899. }
  5900. list := p.exprList2identList(lhs)
  5901. sc := p.sc
  5902. r = &ShortVarDeclNode{
  5903. IdentifierList: list,
  5904. DEFINE: defineTok,
  5905. ExpressionList: expressionList,
  5906. }
  5907. visible := int32(p.ix)
  5908. hasNew := false
  5909. for n := r.IdentifierList; n != nil; n = n.List {
  5910. id := n.IDENT
  5911. ex := sc.declare(id, r, visible, p, false)
  5912. if !ex.declTok.IsValid() {
  5913. hasNew = true
  5914. }
  5915. }
  5916. if !hasNew {
  5917. for n := r.IdentifierList; n != nil; n = n.List {
  5918. id := n.IDENT
  5919. nm := id.Src()
  5920. ex := sc.nodes[nm]
  5921. if ex.declTok.IsValid() {
  5922. p.err(id.Position(), "%s redeclared, previous declaration at %v: (%p)", nm, ex.declTok.Position(), sc)
  5923. }
  5924. }
  5925. }
  5926. return r
  5927. }
  5928. func (p *parser) exprList2identList(list *ExpressionListNode) (r *IdentifierListNode) {
  5929. var last *IdentifierListNode
  5930. for n := list; n != nil; n = n.List {
  5931. next := &IdentifierListNode{
  5932. COMMA: n.COMMA,
  5933. IDENT: p.expr2ident(n.Expression),
  5934. }
  5935. if !next.IDENT.IsValid() {
  5936. continue
  5937. }
  5938. if r == nil {
  5939. r = next
  5940. }
  5941. if last != nil {
  5942. last.List = next
  5943. }
  5944. last = next
  5945. }
  5946. return r
  5947. }
  5948. func (p *parser) expr2ident(e Expression) (r Token) {
  5949. switch x := e.(type) {
  5950. case *OperandNode:
  5951. if (x.TypeArgs != nil || x.LiteralValue != nil) && p.reportDeclarationErrors {
  5952. p.err(x.Position(), "expected identifier")
  5953. break
  5954. }
  5955. return p.expr2ident(x.OperandName)
  5956. case *OperandNameNode:
  5957. return x.Name
  5958. p.err(x.Position(), "expected identifier")
  5959. default:
  5960. if p.reportDeclarationErrors {
  5961. p.err(x.Position(), "expected identifier")
  5962. }
  5963. }
  5964. return r
  5965. }
  5966. // SignatureNode represents the production
  5967. //
  5968. // Signature = Parameters [ Result ] .
  5969. type SignatureNode struct {
  5970. Parameters *ParametersNode
  5971. Result *ResultNode
  5972. typeCache
  5973. }
  5974. // Source implements Node.
  5975. func (n *SignatureNode) Source(full bool) string { return nodeSource(n, full) }
  5976. // Position implements Node.
  5977. func (n *SignatureNode) Position() (r token.Position) {
  5978. if n == nil {
  5979. return r
  5980. }
  5981. return n.Parameters.Position()
  5982. }
  5983. func (p *parser) signature() *SignatureNode {
  5984. var (
  5985. parameters *ParametersNode
  5986. result *ResultNode
  5987. )
  5988. // ebnf.Sequence Parameters [ Result ] ctx [LPAREN]
  5989. {
  5990. ix := p.ix
  5991. // *ebnf.Name Parameters ctx [LPAREN]
  5992. if parameters = p.parameters(); parameters == nil {
  5993. p.back(ix)
  5994. return nil
  5995. }
  5996. // *ebnf.Option [ Result ] ctx []
  5997. switch p.c() {
  5998. case ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT:
  5999. // *ebnf.Name Result ctx [ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT]
  6000. if result = p.result(); result == nil {
  6001. goto _0
  6002. }
  6003. }
  6004. goto _1
  6005. _0:
  6006. result = nil
  6007. _1:
  6008. }
  6009. return &SignatureNode{
  6010. Parameters: parameters,
  6011. Result: result,
  6012. }
  6013. }
  6014. // IncDecStmtNode represents the production
  6015. //
  6016. // IncDecStmt = Expression ( "++" | "--" ) .
  6017. type IncDecStmtNode struct {
  6018. Expression Expression
  6019. Token Token
  6020. }
  6021. // Source implements Node.
  6022. func (n *IncDecStmtNode) Source(full bool) string { return nodeSource(n, full) }
  6023. // Position implements Node.
  6024. func (n *IncDecStmtNode) Position() (r token.Position) {
  6025. if n == nil {
  6026. return r
  6027. }
  6028. return n.Expression.Position()
  6029. }
  6030. func (p *parser) simpleStmt(preBlock bool) Node {
  6031. var (
  6032. expressionList *ExpressionListNode
  6033. assignment *AssignmentNode
  6034. shortVarDecl *ShortVarDeclNode
  6035. arrowTok Token
  6036. expression Expression
  6037. emptyStmt *EmptyStmtNode
  6038. )
  6039. // ebnf.Alternative ExpressionList [ Assignment | ShortVarDecl | "<-" Expression | "++" | "--" ] | EmptyStmt ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR /* ε */]
  6040. switch p.c() {
  6041. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR: // 0
  6042. // ebnf.Sequence ExpressionList [ Assignment | ShortVarDecl | "<-" Expression | "++" | "--" ] ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  6043. {
  6044. ix := p.ix
  6045. // *ebnf.Name ExpressionList ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  6046. if expressionList = p.expressionList(preBlock); expressionList == nil {
  6047. p.back(ix)
  6048. goto _0
  6049. }
  6050. // *ebnf.Option [ Assignment | ShortVarDecl | "<-" Expression | "++" | "--" ] ctx []
  6051. switch p.c() {
  6052. case ADD_ASSIGN, AND_ASSIGN, AND_NOT_ASSIGN, ARROW, ASSIGN, DEC, DEFINE, INC, MUL_ASSIGN, OR_ASSIGN, QUO_ASSIGN, REM_ASSIGN, SHL_ASSIGN, SHR_ASSIGN, SUB_ASSIGN, XOR_ASSIGN:
  6053. // ebnf.Alternative Assignment | ShortVarDecl | "<-" Expression | "++" | "--" ctx [ADD_ASSIGN, AND_ASSIGN, AND_NOT_ASSIGN, ARROW, ASSIGN, DEC, DEFINE, INC, MUL_ASSIGN, OR_ASSIGN, QUO_ASSIGN, REM_ASSIGN, SHL_ASSIGN, SHR_ASSIGN, SUB_ASSIGN, XOR_ASSIGN]
  6054. switch p.c() {
  6055. case ADD_ASSIGN, AND_ASSIGN, AND_NOT_ASSIGN, ASSIGN, MUL_ASSIGN, OR_ASSIGN, QUO_ASSIGN, REM_ASSIGN, SHL_ASSIGN, SHR_ASSIGN, SUB_ASSIGN, XOR_ASSIGN: // 0
  6056. // *ebnf.Name Assignment ctx [ADD_ASSIGN, AND_ASSIGN, AND_NOT_ASSIGN, ASSIGN, MUL_ASSIGN, OR_ASSIGN, QUO_ASSIGN, REM_ASSIGN, SHL_ASSIGN, SHR_ASSIGN, SUB_ASSIGN, XOR_ASSIGN]
  6057. if assignment = p.assignment(expressionList, preBlock); assignment == nil {
  6058. goto _4
  6059. }
  6060. return assignment
  6061. _4:
  6062. assignment = nil
  6063. goto _2
  6064. case DEFINE: // 1
  6065. // *ebnf.Name ShortVarDecl ctx [DEFINE]
  6066. if shortVarDecl = p.shortVarDecl(expressionList, preBlock); shortVarDecl == nil {
  6067. goto _6
  6068. }
  6069. return shortVarDecl
  6070. _6:
  6071. shortVarDecl = nil
  6072. goto _2
  6073. case ARROW: // 2
  6074. // ebnf.Sequence "<-" Expression ctx [ARROW]
  6075. {
  6076. switch p.peek(1) {
  6077. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  6078. default:
  6079. goto _8
  6080. }
  6081. ix := p.ix
  6082. // *ebnf.Token "<-" ctx [ARROW]
  6083. arrowTok = p.expect(ARROW)
  6084. // *ebnf.Name Expression ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  6085. if expression = p.expression(preBlock); expression == nil {
  6086. p.back(ix)
  6087. goto _8
  6088. }
  6089. }
  6090. if expressionList.Len() > 1 {
  6091. p.err(expressionList.Position(), "expected one expression: %s", expressionList.Source(false))
  6092. }
  6093. return &SendStmtNode{
  6094. Channel: expressionList.first(),
  6095. ARROW: arrowTok,
  6096. Expression: expression,
  6097. }
  6098. _8:
  6099. arrowTok = Token{}
  6100. expression = nil
  6101. goto _2
  6102. case INC: // 3
  6103. // *ebnf.Token "++" ctx [INC]
  6104. if expressionList.Len() > 1 {
  6105. p.err(expressionList.Position(), "expected one expression: %s", expressionList.Source(false))
  6106. }
  6107. return &IncDecStmtNode{
  6108. Expression: expressionList.first(),
  6109. Token: p.expect(INC),
  6110. }
  6111. case DEC: // 4
  6112. // *ebnf.Token "--" ctx [DEC]
  6113. if expressionList.Len() > 1 {
  6114. p.err(expressionList.Position(), "expected one expression: %s", expressionList.Source(false))
  6115. }
  6116. return &IncDecStmtNode{
  6117. Expression: expressionList.first(),
  6118. Token: p.expect(DEC),
  6119. }
  6120. default:
  6121. goto _2
  6122. }
  6123. }
  6124. goto _3
  6125. _2:
  6126. arrowTok = Token{}
  6127. assignment = nil
  6128. expression = nil
  6129. shortVarDecl = nil
  6130. _3:
  6131. }
  6132. break
  6133. _0:
  6134. arrowTok = Token{}
  6135. assignment = nil
  6136. expression = nil
  6137. expressionList = nil
  6138. shortVarDecl = nil
  6139. return nil
  6140. default: // /* ε */ 1
  6141. // *ebnf.Name EmptyStmt ctx [ /* ε */]
  6142. if emptyStmt = p.emptyStmt(); emptyStmt == nil {
  6143. goto _14
  6144. }
  6145. return emptyStmt
  6146. _14:
  6147. emptyStmt = nil
  6148. return nil
  6149. }
  6150. if expressionList == nil || expressionList.Len() > 1 {
  6151. return nil
  6152. }
  6153. return expressionList.first()
  6154. }
  6155. // SliceNode represents the production
  6156. //
  6157. // Slice = "[" [ Expression ] ":" [ Expression ] "]" | "[" [ Expression ] ":" Expression ":" Expression "]" .
  6158. type SliceNode struct {
  6159. LBRACK Token
  6160. Expression Expression
  6161. COLON Token
  6162. Expression2 Expression
  6163. RBRACK Token
  6164. COLON2 Token
  6165. Expression3 Expression
  6166. }
  6167. // Source implements Node.
  6168. func (n *SliceNode) Source(full bool) string { return nodeSource(n, full) }
  6169. // Position implements Node.
  6170. func (n *SliceNode) Position() (r token.Position) {
  6171. if n == nil {
  6172. return r
  6173. }
  6174. panic("TODO")
  6175. }
  6176. func (p *parser) slice() *SliceNode {
  6177. var (
  6178. ok bool
  6179. lbrackTok Token
  6180. expression Expression
  6181. colonTok Token
  6182. expression2 Expression
  6183. rbrackTok Token
  6184. colon2Tok Token
  6185. expression3 Expression
  6186. )
  6187. // ebnf.Alternative "[" [ Expression ] ":" [ Expression ] "]" | "[" [ Expression ] ":" Expression ":" Expression "]" ctx [LBRACK]
  6188. switch p.c() {
  6189. case LBRACK: // 0 1
  6190. // ebnf.Sequence "[" [ Expression ] ":" [ Expression ] "]" ctx [LBRACK]
  6191. {
  6192. ix := p.ix
  6193. // *ebnf.Token "[" ctx [LBRACK]
  6194. lbrackTok = p.expect(LBRACK)
  6195. // *ebnf.Option [ Expression ] ctx []
  6196. switch p.c() {
  6197. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  6198. // *ebnf.Name Expression ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  6199. if expression = p.expression(false); expression == nil {
  6200. goto _1
  6201. }
  6202. }
  6203. goto _2
  6204. _1:
  6205. expression = nil
  6206. _2:
  6207. // *ebnf.Token ":" ctx []
  6208. if colonTok, ok = p.accept(COLON); !ok {
  6209. p.back(ix)
  6210. goto _0
  6211. }
  6212. // *ebnf.Option [ Expression ] ctx []
  6213. switch p.c() {
  6214. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  6215. // *ebnf.Name Expression ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  6216. if expression2 = p.expression(false); expression2 == nil {
  6217. goto _3
  6218. }
  6219. }
  6220. goto _4
  6221. _3:
  6222. expression2 = nil
  6223. _4:
  6224. // *ebnf.Token "]" ctx []
  6225. if rbrackTok, ok = p.accept(RBRACK); !ok {
  6226. p.back(ix)
  6227. goto _0
  6228. }
  6229. }
  6230. break
  6231. _0:
  6232. colonTok = Token{}
  6233. expression = nil
  6234. expression2 = nil
  6235. lbrackTok = Token{}
  6236. rbrackTok = Token{}
  6237. // ebnf.Sequence "[" [ Expression ] ":" Expression ":" Expression "]" ctx [LBRACK]
  6238. {
  6239. ix := p.ix
  6240. // *ebnf.Token "[" ctx [LBRACK]
  6241. lbrackTok = p.expect(LBRACK)
  6242. // *ebnf.Option [ Expression ] ctx []
  6243. switch p.c() {
  6244. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  6245. // *ebnf.Name Expression ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  6246. if expression = p.expression(false); expression == nil {
  6247. goto _6
  6248. }
  6249. }
  6250. goto _7
  6251. _6:
  6252. expression = nil
  6253. _7:
  6254. // *ebnf.Token ":" ctx []
  6255. if colonTok, ok = p.accept(COLON); !ok {
  6256. p.back(ix)
  6257. goto _5
  6258. }
  6259. // *ebnf.Name Expression ctx []
  6260. switch p.c() {
  6261. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  6262. if expression2 = p.expression(false); expression2 == nil {
  6263. p.back(ix)
  6264. goto _5
  6265. }
  6266. default:
  6267. p.back(ix)
  6268. goto _5
  6269. }
  6270. // *ebnf.Token ":" ctx []
  6271. if colon2Tok, ok = p.accept(COLON); !ok {
  6272. p.back(ix)
  6273. goto _5
  6274. }
  6275. // *ebnf.Name Expression ctx []
  6276. switch p.c() {
  6277. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  6278. if expression3 = p.expression(false); expression3 == nil {
  6279. p.back(ix)
  6280. goto _5
  6281. }
  6282. default:
  6283. p.back(ix)
  6284. goto _5
  6285. }
  6286. // *ebnf.Token "]" ctx []
  6287. if rbrackTok, ok = p.accept(RBRACK); !ok {
  6288. p.back(ix)
  6289. goto _5
  6290. }
  6291. }
  6292. break
  6293. _5:
  6294. colon2Tok = Token{}
  6295. colonTok = Token{}
  6296. expression = nil
  6297. expression2 = nil
  6298. expression3 = nil
  6299. lbrackTok = Token{}
  6300. rbrackTok = Token{}
  6301. return nil
  6302. default:
  6303. return nil
  6304. }
  6305. return &SliceNode{
  6306. LBRACK: lbrackTok,
  6307. Expression: expression,
  6308. COLON: colonTok,
  6309. Expression2: expression2,
  6310. RBRACK: rbrackTok,
  6311. COLON2: colon2Tok,
  6312. Expression3: expression3,
  6313. }
  6314. }
  6315. // SliceTypeNode represents the production
  6316. //
  6317. // SliceType = "[" "]" ElementType .
  6318. type SliceTypeNode struct {
  6319. LBRACK Token
  6320. RBRACK Token
  6321. ElementType Node
  6322. guard
  6323. }
  6324. // Source implements Node.
  6325. func (n *SliceTypeNode) Source(full bool) string { return nodeSource(n, full) }
  6326. // Position implements Node.
  6327. func (n *SliceTypeNode) Position() (r token.Position) {
  6328. if n == nil {
  6329. return r
  6330. }
  6331. return n.LBRACK.Position()
  6332. }
  6333. func (p *parser) sliceType() *SliceTypeNode {
  6334. var (
  6335. lbrackTok Token
  6336. rbrackTok Token
  6337. elementType Node
  6338. )
  6339. // ebnf.Sequence "[" "]" ElementType ctx [LBRACK]
  6340. {
  6341. if p.peek(1) != RBRACK {
  6342. return nil
  6343. }
  6344. ix := p.ix
  6345. // *ebnf.Token "[" ctx [LBRACK]
  6346. lbrackTok = p.expect(LBRACK)
  6347. // *ebnf.Token "]" ctx [RBRACK]
  6348. rbrackTok = p.expect(RBRACK)
  6349. // *ebnf.Name ElementType ctx []
  6350. switch p.c() {
  6351. case ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT:
  6352. if elementType = p.type1(); elementType == nil {
  6353. p.back(ix)
  6354. return nil
  6355. }
  6356. default:
  6357. p.back(ix)
  6358. return nil
  6359. }
  6360. }
  6361. return &SliceTypeNode{
  6362. LBRACK: lbrackTok,
  6363. RBRACK: rbrackTok,
  6364. ElementType: elementType,
  6365. }
  6366. }
  6367. // ImportDeclListNode represents the production
  6368. //
  6369. // ImportDeclListNode = { ImportDecl ";" } .
  6370. type ImportDeclListNode struct {
  6371. ImportDecl *ImportDeclNode
  6372. SEMICOLON Token
  6373. List *ImportDeclListNode
  6374. }
  6375. // Source implements Node.
  6376. func (n *ImportDeclListNode) Source(full bool) string { return nodeSource(n, full) }
  6377. // Position implements Node.
  6378. func (n *ImportDeclListNode) Position() (r token.Position) {
  6379. if n == nil {
  6380. return r
  6381. }
  6382. return n.ImportDecl.Position()
  6383. }
  6384. // TopLevelDeclListNode represents the production
  6385. //
  6386. // TopLevelDeclListNode = { TopLevelDecl ";" .
  6387. type TopLevelDeclListNode struct {
  6388. TopLevelDecl Node
  6389. SEMICOLON Token
  6390. List *TopLevelDeclListNode
  6391. }
  6392. // Source implements Node.
  6393. func (n *TopLevelDeclListNode) Source(full bool) string { return nodeSource(n, full) }
  6394. // Position implements Node.
  6395. func (n *TopLevelDeclListNode) Position() (r token.Position) {
  6396. if n == nil {
  6397. return r
  6398. }
  6399. return n.TopLevelDecl.Position()
  6400. }
  6401. // SourceFileNode represents the production
  6402. //
  6403. // SourceFile = PackageClause ";" { ImportDecl ";" } { TopLevelDecl ";" } .
  6404. type SourceFileNode struct {
  6405. PackageClause *PackageClauseNode
  6406. SEMICOLON Token
  6407. ImportDeclList *ImportDeclListNode
  6408. TopLevelDeclList *TopLevelDeclListNode
  6409. }
  6410. // Source implements Node.
  6411. func (n *SourceFileNode) Source(full bool) string { return nodeSource(n, full) }
  6412. // Position implements Node.
  6413. func (n *SourceFileNode) Position() (r token.Position) {
  6414. if n == nil {
  6415. return r
  6416. }
  6417. return n.PackageClause.Position()
  6418. }
  6419. func (p *parser) sourceFile() *SourceFileNode {
  6420. var (
  6421. ok bool
  6422. packageClause *PackageClauseNode
  6423. semicolonTok Token
  6424. list, last *ImportDeclListNode
  6425. list2, last2 *TopLevelDeclListNode
  6426. )
  6427. // ebnf.Sequence PackageClause ";" { ImportDecl ";" } { TopLevelDecl ";" } ctx [PACKAGE]
  6428. {
  6429. ix := p.ix
  6430. // *ebnf.Name PackageClause ctx [PACKAGE]
  6431. if packageClause = p.packageClause(); packageClause == nil {
  6432. p.back(ix)
  6433. return nil
  6434. }
  6435. // *ebnf.Token ";" ctx []
  6436. if semicolonTok, ok = p.accept(SEMICOLON); !ok {
  6437. p.back(ix)
  6438. return nil
  6439. }
  6440. // *ebnf.Repetition { ImportDecl ";" } ctx []
  6441. _0:
  6442. {
  6443. var importDecl *ImportDeclNode
  6444. var semicolonTok Token
  6445. switch p.c() {
  6446. case IMPORT:
  6447. // ebnf.Sequence ImportDecl ";" ctx [IMPORT]
  6448. ix := p.ix
  6449. // *ebnf.Name ImportDecl ctx [IMPORT]
  6450. if importDecl = p.importDecl(); importDecl == nil {
  6451. p.back(ix)
  6452. goto _1
  6453. }
  6454. // *ebnf.Token ";" ctx []
  6455. if semicolonTok, ok = p.accept(SEMICOLON); !ok {
  6456. p.back(ix)
  6457. goto _1
  6458. }
  6459. next := &ImportDeclListNode{
  6460. ImportDecl: importDecl,
  6461. SEMICOLON: semicolonTok,
  6462. }
  6463. if last != nil {
  6464. last.List = next
  6465. }
  6466. if list == nil {
  6467. list = next
  6468. }
  6469. last = next
  6470. goto _0
  6471. }
  6472. _1:
  6473. }
  6474. // *ebnf.Repetition { TopLevelDecl ";" } ctx []
  6475. _2:
  6476. {
  6477. var topLevelDecl Node
  6478. var semicolonTok Token
  6479. switch p.c() {
  6480. case CONST, FUNC, TYPE, VAR:
  6481. // ebnf.Sequence TopLevelDecl ";" ctx [CONST, FUNC, TYPE, VAR]
  6482. ix := p.ix
  6483. // *ebnf.Name TopLevelDecl ctx [CONST, FUNC, TYPE, VAR]
  6484. if topLevelDecl = p.topLevelDecl(); topLevelDecl == nil {
  6485. p.back(ix)
  6486. goto _3
  6487. }
  6488. // *ebnf.Token ";" ctx []
  6489. if semicolonTok, ok = p.accept(SEMICOLON); !ok {
  6490. p.back(ix)
  6491. goto _3
  6492. }
  6493. next := &TopLevelDeclListNode{
  6494. TopLevelDecl: topLevelDecl,
  6495. SEMICOLON: semicolonTok,
  6496. }
  6497. if last2 != nil {
  6498. last2.List = next
  6499. }
  6500. if list2 == nil {
  6501. list2 = next
  6502. }
  6503. last2 = next
  6504. goto _2
  6505. }
  6506. _3:
  6507. }
  6508. }
  6509. return &SourceFileNode{
  6510. PackageClause: packageClause,
  6511. SEMICOLON: semicolonTok,
  6512. ImportDeclList: list,
  6513. TopLevelDeclList: list2,
  6514. }
  6515. }
  6516. func (p *parser) statement() Node {
  6517. var (
  6518. declaration Node
  6519. labeledStmt *LabeledStmtNode
  6520. goStmt *GoStmtNode
  6521. returnStmt *ReturnStmtNode
  6522. breakStmt *BreakStmtNode
  6523. continueStmt *ContinueStmtNode
  6524. gotoStmt *GotoStmtNode
  6525. fallthroughStmt *FallthroughStmtNode
  6526. block *BlockNode
  6527. ifStmt Node
  6528. switchStmt *SwitchStmtNode
  6529. selectStmt *SelectStmtNode
  6530. forStmt *ForStmtNode
  6531. deferStmt *DeferStmtNode
  6532. simpleStmt Node
  6533. )
  6534. // ebnf.Alternative Declaration | LabeledStmt | GoStmt | ReturnStmt | BreakStmt | ContinueStmt | GotoStmt | FallthroughStmt | Block | IfStmt | SwitchStmt | SelectStmt | ForStmt | DeferStmt | SimpleStmt ctx [ADD, AND, ARROW, BREAK, CHAN, CHAR, CONST, CONTINUE, DEFER, FALLTHROUGH, FLOAT, FOR, FUNC, GO, GOTO, IDENT, IF, IMAG, INT, INTERFACE, LBRACE, LBRACK, LPAREN, MAP, MUL, NOT, RETURN, SELECT, STRING, STRUCT, SUB, SWITCH, TYPE, VAR, XOR /* ε */]
  6535. switch p.c() {
  6536. case CONST, TYPE, VAR: // 0
  6537. // *ebnf.Name Declaration ctx [CONST, TYPE, VAR]
  6538. if declaration = p.declaration(); declaration == nil {
  6539. return nil
  6540. }
  6541. return declaration
  6542. case IDENT: // 1 14
  6543. // *ebnf.Name LabeledStmt ctx [IDENT]
  6544. if labeledStmt = p.labeledStmt(); labeledStmt == nil {
  6545. goto _2
  6546. }
  6547. return labeledStmt
  6548. _2:
  6549. labeledStmt = nil
  6550. // *ebnf.Name SimpleStmt ctx [IDENT]
  6551. if simpleStmt = p.simpleStmt(false); simpleStmt == nil {
  6552. return nil
  6553. }
  6554. return simpleStmt
  6555. case GO: // 2
  6556. // *ebnf.Name GoStmt ctx [GO]
  6557. if goStmt = p.goStmt(); goStmt == nil {
  6558. return nil
  6559. }
  6560. return goStmt
  6561. case RETURN: // 3
  6562. // *ebnf.Name ReturnStmt ctx [RETURN]
  6563. if returnStmt = p.returnStmt(); returnStmt == nil {
  6564. return nil
  6565. }
  6566. return returnStmt
  6567. case BREAK: // 4
  6568. // *ebnf.Name BreakStmt ctx [BREAK]
  6569. if breakStmt = p.breakStmt(); breakStmt == nil {
  6570. return nil
  6571. }
  6572. return breakStmt
  6573. case CONTINUE: // 5
  6574. // *ebnf.Name ContinueStmt ctx [CONTINUE]
  6575. if continueStmt = p.continueStmt(); continueStmt == nil {
  6576. return nil
  6577. }
  6578. return continueStmt
  6579. case GOTO: // 6
  6580. // *ebnf.Name GotoStmt ctx [GOTO]
  6581. if gotoStmt = p.gotoStmt(); gotoStmt == nil {
  6582. return nil
  6583. }
  6584. return gotoStmt
  6585. case FALLTHROUGH: // 7
  6586. // *ebnf.Name FallthroughStmt ctx [FALLTHROUGH]
  6587. if fallthroughStmt = p.fallthroughStmt(); fallthroughStmt == nil {
  6588. return nil
  6589. }
  6590. return fallthroughStmt
  6591. case LBRACE: // 8
  6592. // *ebnf.Name Block ctx [LBRACE]
  6593. if block = p.block(nil, nil); block == nil {
  6594. return nil
  6595. }
  6596. return block
  6597. return nil
  6598. case IF: // 9
  6599. // *ebnf.Name IfStmt ctx [IF]
  6600. if ifStmt = p.ifStmt(); ifStmt == nil {
  6601. return nil
  6602. }
  6603. return ifStmt
  6604. case SWITCH: // 10
  6605. // *ebnf.Name SwitchStmt ctx [SWITCH]
  6606. if switchStmt = p.switchStmt(); switchStmt == nil {
  6607. return nil
  6608. }
  6609. return switchStmt
  6610. case SELECT: // 11
  6611. // *ebnf.Name SelectStmt ctx [SELECT]
  6612. if selectStmt = p.selectStmt(); selectStmt == nil {
  6613. return nil
  6614. }
  6615. return selectStmt
  6616. case FOR: // 12
  6617. // *ebnf.Name ForStmt ctx [FOR]
  6618. if forStmt = p.forStmt(); forStmt == nil {
  6619. return nil
  6620. }
  6621. return forStmt
  6622. case DEFER: // 13
  6623. // *ebnf.Name DeferStmt ctx [DEFER]
  6624. if deferStmt = p.deferStmt(); deferStmt == nil {
  6625. return nil
  6626. }
  6627. return deferStmt
  6628. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR /* ε */ : // 14
  6629. // *ebnf.Name SimpleStmt ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR /* ε */]
  6630. if simpleStmt = p.simpleStmt(false); simpleStmt == nil {
  6631. return nil
  6632. }
  6633. return simpleStmt
  6634. }
  6635. return nil
  6636. }
  6637. // StatementListNode represents the production
  6638. //
  6639. // StatementList = { Statement ";" } .
  6640. type StatementListNode struct {
  6641. Statement Node
  6642. SEMICOLON Token
  6643. List *StatementListNode
  6644. }
  6645. // Source implements Node.
  6646. func (n *StatementListNode) Source(full bool) string { return nodeSource(n, full) }
  6647. // Position implements Node.
  6648. func (n *StatementListNode) Position() (r token.Position) {
  6649. if n == nil {
  6650. return r
  6651. }
  6652. panic("TODO")
  6653. }
  6654. func (p *parser) statementList() *StatementListNode {
  6655. var (
  6656. statement Node
  6657. list, last *StatementListNode
  6658. )
  6659. for {
  6660. ix := p.ix
  6661. switch p.c() {
  6662. case ADD, AND, ARROW, BREAK, CHAN, CHAR, CONST, CONTINUE, DEFER, FALLTHROUGH, FLOAT, FOR, FUNC, GO, GOTO, IDENT, IF, IMAG, INT, INTERFACE, LBRACE, LBRACK, LPAREN, MAP, MUL, NOT, RETURN, SELECT, STRING, STRUCT, SUB, SWITCH, TYPE, VAR, XOR /* ε */ :
  6663. if statement = p.statement(); statement == nil {
  6664. p.back(ix)
  6665. goto _1
  6666. }
  6667. case SEMICOLON:
  6668. next := &StatementListNode{
  6669. SEMICOLON: p.consume(),
  6670. }
  6671. if last != nil {
  6672. last.List = next
  6673. }
  6674. if list == nil {
  6675. list = next
  6676. }
  6677. last = next
  6678. continue
  6679. default:
  6680. goto _1
  6681. }
  6682. if p.c() != SEMICOLON {
  6683. next := &StatementListNode{
  6684. Statement: statement,
  6685. }
  6686. if last != nil {
  6687. last.List = next
  6688. }
  6689. if list == nil {
  6690. list = next
  6691. }
  6692. last = next
  6693. goto _1
  6694. }
  6695. next := &StatementListNode{
  6696. Statement: statement,
  6697. SEMICOLON: p.consume(),
  6698. }
  6699. if last != nil {
  6700. last.List = next
  6701. }
  6702. if list == nil {
  6703. list = next
  6704. }
  6705. last = next
  6706. }
  6707. _1:
  6708. return list
  6709. }
  6710. // FieldDeclListNode represents the production
  6711. //
  6712. // FieldDeclListNode = { FieldDecl ";" } .
  6713. type FieldDeclListNode struct {
  6714. FieldDecl *FieldDeclNode
  6715. SEMICOLON Token
  6716. List *FieldDeclListNode
  6717. }
  6718. // Source implements Node.
  6719. func (n *FieldDeclListNode) Source(full bool) string { return nodeSource(n, full) }
  6720. // Position implements Node.
  6721. func (n *FieldDeclListNode) Position() (r token.Position) {
  6722. if n == nil {
  6723. return r
  6724. }
  6725. return n.FieldDecl.Position()
  6726. }
  6727. // StructTypeNode represents the production
  6728. //
  6729. // StructType = "struct" "{" { FieldDecl ";" } "}" .
  6730. type StructTypeNode struct {
  6731. STRUCT Token
  6732. LBRACE Token
  6733. FieldDeclList *FieldDeclListNode
  6734. RBRACE Token
  6735. fields []Field
  6736. guard
  6737. }
  6738. // Source implements Node.
  6739. func (n *StructTypeNode) Source(full bool) string { return nodeSource(n, full) }
  6740. // Position implements Node.
  6741. func (n *StructTypeNode) Position() (r token.Position) {
  6742. if n == nil {
  6743. return r
  6744. }
  6745. return n.STRUCT.Position()
  6746. }
  6747. func (p *parser) structType() *StructTypeNode {
  6748. var (
  6749. ok bool
  6750. structTok Token
  6751. lbraceTok Token
  6752. list, last *FieldDeclListNode
  6753. rbraceTok Token
  6754. )
  6755. // ebnf.Sequence "struct" "{" { FieldDecl ";" } [ FieldDecl ] "}" ctx [STRUCT]
  6756. {
  6757. if p.peek(1) != LBRACE {
  6758. return nil
  6759. }
  6760. ix := p.ix
  6761. // *ebnf.Token "struct" ctx [STRUCT]
  6762. structTok = p.expect(STRUCT)
  6763. // *ebnf.Token "{" ctx [LBRACE]
  6764. lbraceTok = p.expect(LBRACE)
  6765. // *ebnf.Repetition { FieldDecl ";" } ctx []
  6766. _0:
  6767. {
  6768. var fieldDecl *FieldDeclNode
  6769. var semicolonTok Token
  6770. switch p.c() {
  6771. case IDENT, MUL:
  6772. // ebnf.Sequence FieldDecl ";" ctx [IDENT, MUL]
  6773. ix := p.ix
  6774. // *ebnf.Name FieldDecl ctx [IDENT, MUL]
  6775. if fieldDecl = p.fieldDecl(); fieldDecl == nil {
  6776. p.back(ix)
  6777. goto _1
  6778. }
  6779. if p.c() == RBRACE {
  6780. next := &FieldDeclListNode{
  6781. FieldDecl: fieldDecl,
  6782. }
  6783. if last != nil {
  6784. last.List = next
  6785. }
  6786. if list == nil {
  6787. list = next
  6788. }
  6789. last = next
  6790. goto _1
  6791. }
  6792. // *ebnf.Token ";" ctx []
  6793. if semicolonTok, ok = p.accept(SEMICOLON); !ok {
  6794. p.back(ix)
  6795. goto _1
  6796. }
  6797. next := &FieldDeclListNode{
  6798. FieldDecl: fieldDecl,
  6799. SEMICOLON: semicolonTok,
  6800. }
  6801. if last != nil {
  6802. last.List = next
  6803. }
  6804. if list == nil {
  6805. list = next
  6806. }
  6807. last = next
  6808. goto _0
  6809. }
  6810. _1:
  6811. }
  6812. // *ebnf.Token "}" ctx []
  6813. if rbraceTok, ok = p.accept(RBRACE); !ok {
  6814. p.back(ix)
  6815. return nil
  6816. }
  6817. }
  6818. return &StructTypeNode{
  6819. STRUCT: structTok,
  6820. LBRACE: lbraceTok,
  6821. FieldDeclList: list,
  6822. RBRACE: rbraceTok,
  6823. }
  6824. }
  6825. // SwitchStmtNode represents the production
  6826. //
  6827. // SwitchStmt = ExprSwitchStmt | TypeSwitchStmt .
  6828. type SwitchStmtNode struct {
  6829. ExprSwitchStmt *ExprSwitchStmtNode
  6830. TypeSwitchStmt *TypeSwitchStmtNode
  6831. }
  6832. // Source implements Node.
  6833. func (n *SwitchStmtNode) Source(full bool) string { return nodeSource(n, full) }
  6834. // Position implements Node.
  6835. func (n *SwitchStmtNode) Position() (r token.Position) {
  6836. if n == nil {
  6837. return r
  6838. }
  6839. panic("TODO")
  6840. }
  6841. func (p *parser) switchStmt() *SwitchStmtNode {
  6842. var (
  6843. exprSwitchStmt *ExprSwitchStmtNode
  6844. typeSwitchStmt *TypeSwitchStmtNode
  6845. )
  6846. p.openScope()
  6847. defer p.closeScope()
  6848. // ebnf.Alternative ExprSwitchStmt | TypeSwitchStmt ctx [SWITCH]
  6849. switch p.c() {
  6850. case SWITCH: // 0 1
  6851. // *ebnf.Name ExprSwitchStmt ctx [SWITCH]
  6852. if exprSwitchStmt = p.exprSwitchStmt(); exprSwitchStmt == nil {
  6853. goto _0
  6854. }
  6855. break
  6856. _0:
  6857. exprSwitchStmt = nil
  6858. p.closeScope()
  6859. p.openScope()
  6860. // *ebnf.Name TypeSwitchStmt ctx [SWITCH]
  6861. if typeSwitchStmt = p.typeSwitchStmt(); typeSwitchStmt == nil {
  6862. goto _1
  6863. }
  6864. break
  6865. _1:
  6866. typeSwitchStmt = nil
  6867. return nil
  6868. default:
  6869. return nil
  6870. }
  6871. return &SwitchStmtNode{
  6872. ExprSwitchStmt: exprSwitchStmt,
  6873. TypeSwitchStmt: typeSwitchStmt,
  6874. }
  6875. }
  6876. // TagNode represents the production
  6877. //
  6878. // Tag = string_lit .
  6879. type TagNode struct {
  6880. STRING Token
  6881. }
  6882. // Source implements Node.
  6883. func (n *TagNode) Source(full bool) string { return nodeSource(n, full) }
  6884. // Position implements Node.
  6885. func (n *TagNode) Position() (r token.Position) {
  6886. if n == nil {
  6887. return r
  6888. }
  6889. return n.STRING.Position()
  6890. }
  6891. func (p *parser) tag() *TagNode {
  6892. var (
  6893. stringTok Token
  6894. )
  6895. // *ebnf.Name string_lit ctx [STRING]
  6896. stringTok = p.expect(STRING)
  6897. return &TagNode{
  6898. STRING: stringTok,
  6899. }
  6900. }
  6901. func (p *parser) topLevelDecl() (r Node) {
  6902. // ebnf.Alternative Declaration | FunctionDecl | MethodDecl ctx [CONST, FUNC, TYPE, VAR]
  6903. switch p.c() {
  6904. case CONST, TYPE, VAR: // 0
  6905. // *ebnf.Name Declaration ctx [CONST, TYPE, VAR]
  6906. return p.declaration()
  6907. case FUNC: // 1 2
  6908. // *ebnf.Name FunctionDecl ctx [FUNC]
  6909. if functionDecl := p.functionDecl(); functionDecl != nil {
  6910. return functionDecl
  6911. }
  6912. // *ebnf.Name MethodDecl ctx [FUNC]
  6913. return p.methodDecl()
  6914. }
  6915. return nil
  6916. }
  6917. // TypeNode represents the production
  6918. //
  6919. // Type = TypeName TypeArgs .
  6920. type TypeNode struct {
  6921. TypeName *TypeNameNode
  6922. TypeArgs *TypeArgsNode
  6923. }
  6924. // Source implements Node.
  6925. func (n *TypeNode) Source(full bool) string { return nodeSource(n, full) }
  6926. // Position implements Node.
  6927. func (n *TypeNode) Position() (r token.Position) {
  6928. if n == nil {
  6929. return r
  6930. }
  6931. if n.TypeName != nil {
  6932. return n.TypeName.Position()
  6933. }
  6934. return r
  6935. }
  6936. // ParenthesizedTypeNode represents the production
  6937. //
  6938. // ParenthesizedType = "(" Type ")" .
  6939. type ParenthesizedTypeNode struct {
  6940. LPAREN Token
  6941. TypeNode Type
  6942. RPAREN Token
  6943. }
  6944. // Source implements Node.
  6945. func (n *ParenthesizedTypeNode) Source(full bool) string { return nodeSource(n, full) }
  6946. // Position implements Node.
  6947. func (n *ParenthesizedTypeNode) Position() (r token.Position) {
  6948. if n == nil {
  6949. return r
  6950. }
  6951. if n.LPAREN.IsValid() {
  6952. return n.LPAREN.Position()
  6953. }
  6954. return r
  6955. }
  6956. func (p *parser) type1() Type {
  6957. var (
  6958. ok bool
  6959. typeName *TypeNameNode
  6960. typeArgs *TypeArgsNode
  6961. typeLit Type
  6962. lparenTok Token
  6963. typeNode Type
  6964. rparenTok Token
  6965. )
  6966. // ebnf.Alternative TypeName [ TypeArgs ] | TypeLit | "(" Type ")" ctx [ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT]
  6967. switch p.c() {
  6968. case IDENT: // 0
  6969. // ebnf.Sequence TypeName [ TypeArgs ] ctx [IDENT]
  6970. {
  6971. ix := p.ix
  6972. // *ebnf.Name TypeName ctx [IDENT]
  6973. if typeName = p.typeName(); typeName == nil {
  6974. p.back(ix)
  6975. goto _0
  6976. }
  6977. // *ebnf.Option [ TypeArgs ] ctx []
  6978. switch p.c() {
  6979. case LBRACK:
  6980. // *ebnf.Name TypeArgs ctx [LBRACK]
  6981. if typeArgs = p.typeArgs(); typeArgs == nil {
  6982. goto _2
  6983. }
  6984. }
  6985. goto _3
  6986. _2:
  6987. typeArgs = nil
  6988. _3:
  6989. }
  6990. if typeArgs == nil {
  6991. return typeName
  6992. }
  6993. break
  6994. _0:
  6995. typeArgs = nil
  6996. typeName = nil
  6997. return nil
  6998. case ARROW, CHAN, FUNC, INTERFACE, LBRACK, MAP, MUL, STRUCT: // 1
  6999. // *ebnf.Name TypeLit ctx [ARROW, CHAN, FUNC, INTERFACE, LBRACK, MAP, MUL, STRUCT]
  7000. if typeLit = p.typeLit(); typeLit == nil {
  7001. goto _4
  7002. }
  7003. return typeLit
  7004. _4:
  7005. typeLit = nil
  7006. return nil
  7007. case LPAREN: // 2
  7008. // ebnf.Sequence "(" Type ")" ctx [LPAREN]
  7009. {
  7010. switch p.peek(1) {
  7011. case ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT:
  7012. default:
  7013. goto _6
  7014. }
  7015. ix := p.ix
  7016. // *ebnf.Token "(" ctx [LPAREN]
  7017. lparenTok = p.expect(LPAREN)
  7018. // *ebnf.Name Type ctx [ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT]
  7019. if typeNode = p.type1(); typeNode == nil {
  7020. p.back(ix)
  7021. goto _6
  7022. }
  7023. // *ebnf.Token ")" ctx []
  7024. if rparenTok, ok = p.accept(RPAREN); !ok {
  7025. p.back(ix)
  7026. goto _6
  7027. }
  7028. }
  7029. return &ParenthesizedTypeNode{LPAREN: lparenTok, TypeNode: typeNode, RPAREN: rparenTok}
  7030. _6:
  7031. lparenTok = Token{}
  7032. rparenTok = Token{}
  7033. typeNode = nil
  7034. return nil
  7035. default:
  7036. return nil
  7037. }
  7038. return &TypeNode{
  7039. TypeName: typeName,
  7040. TypeArgs: typeArgs,
  7041. }
  7042. }
  7043. // TypeArgsNode represents the production
  7044. //
  7045. // TypeArgs = "[" TypeList [ "," ] "]" .
  7046. type TypeArgsNode struct {
  7047. LBRACK Token
  7048. TypeList *TypeListNode
  7049. COMMA Token
  7050. RBRACK Token
  7051. }
  7052. // Source implements Node.
  7053. func (n *TypeArgsNode) Source(full bool) string { return nodeSource(n, full) }
  7054. // Position implements Node.
  7055. func (n *TypeArgsNode) Position() (r token.Position) {
  7056. if n == nil {
  7057. return r
  7058. }
  7059. return n.LBRACK.Position()
  7060. }
  7061. func (p *parser) typeArgs() *TypeArgsNode {
  7062. var (
  7063. ok bool
  7064. lbrackTok Token
  7065. typeList *TypeListNode
  7066. commaTok Token
  7067. rbrackTok Token
  7068. )
  7069. // ebnf.Sequence "[" TypeList [ "," ] "]" ctx [LBRACK]
  7070. {
  7071. switch p.peek(1) {
  7072. case ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT:
  7073. default:
  7074. return nil
  7075. }
  7076. ix := p.ix
  7077. // *ebnf.Token "[" ctx [LBRACK]
  7078. lbrackTok = p.expect(LBRACK)
  7079. // *ebnf.Name TypeList ctx [ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT]
  7080. if typeList = p.typeList(); typeList == nil {
  7081. p.back(ix)
  7082. return nil
  7083. }
  7084. // *ebnf.Option [ "," ] ctx []
  7085. switch p.c() {
  7086. case COMMA:
  7087. // *ebnf.Token "," ctx [COMMA]
  7088. commaTok = p.expect(COMMA)
  7089. }
  7090. // *ebnf.Token "]" ctx []
  7091. if rbrackTok, ok = p.accept(RBRACK); !ok {
  7092. p.back(ix)
  7093. return nil
  7094. }
  7095. }
  7096. return &TypeArgsNode{
  7097. LBRACK: lbrackTok,
  7098. TypeList: typeList,
  7099. COMMA: commaTok,
  7100. RBRACK: rbrackTok,
  7101. }
  7102. }
  7103. // TypeAssertionNode represents the production
  7104. //
  7105. // TypeAssertion = "." "(" Type ")" .
  7106. type TypeAssertionNode struct {
  7107. PERIOD Token
  7108. LPAREN Token
  7109. TypeNode Type
  7110. RPAREN Token
  7111. }
  7112. // Source implements Node.
  7113. func (n *TypeAssertionNode) Source(full bool) string { return nodeSource(n, full) }
  7114. // Position implements Node.
  7115. func (n *TypeAssertionNode) Position() (r token.Position) {
  7116. if n == nil {
  7117. return r
  7118. }
  7119. return n.PERIOD.Position()
  7120. }
  7121. func (p *parser) typeAssertion() *TypeAssertionNode {
  7122. var (
  7123. ok bool
  7124. periodTok Token
  7125. lparenTok Token
  7126. typeNode Type
  7127. rparenTok Token
  7128. )
  7129. // ebnf.Sequence "." "(" Type ")" ctx [PERIOD]
  7130. {
  7131. if p.peek(1) != LPAREN {
  7132. return nil
  7133. }
  7134. ix := p.ix
  7135. // *ebnf.Token "." ctx [PERIOD]
  7136. periodTok = p.expect(PERIOD)
  7137. // *ebnf.Token "(" ctx [LPAREN]
  7138. lparenTok = p.expect(LPAREN)
  7139. // *ebnf.Name Type ctx []
  7140. switch p.c() {
  7141. case ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT:
  7142. if typeNode = p.type1(); typeNode == nil {
  7143. p.back(ix)
  7144. return nil
  7145. }
  7146. default:
  7147. p.back(ix)
  7148. return nil
  7149. }
  7150. // *ebnf.Token ")" ctx []
  7151. if rparenTok, ok = p.accept(RPAREN); !ok {
  7152. p.back(ix)
  7153. return nil
  7154. }
  7155. }
  7156. return &TypeAssertionNode{
  7157. PERIOD: periodTok,
  7158. LPAREN: lparenTok,
  7159. TypeNode: typeNode,
  7160. RPAREN: rparenTok,
  7161. }
  7162. }
  7163. // TypeCaseClauseNode represents the production
  7164. //
  7165. // TypeCaseClause = TypeSwitchCase ":" StatementList .
  7166. type TypeCaseClauseNode struct {
  7167. TypeSwitchCase *TypeSwitchCaseNode
  7168. COLON Token
  7169. StatementList *StatementListNode
  7170. }
  7171. // Source implements Node.
  7172. func (n *TypeCaseClauseNode) Source(full bool) string { return nodeSource(n, full) }
  7173. // Position implements Node.
  7174. func (n *TypeCaseClauseNode) Position() (r token.Position) {
  7175. if n == nil {
  7176. return r
  7177. }
  7178. return n.TypeSwitchCase.Position()
  7179. }
  7180. func (p *parser) typeCaseClause() *TypeCaseClauseNode {
  7181. var (
  7182. ok bool
  7183. typeSwitchCase *TypeSwitchCaseNode
  7184. colonTok Token
  7185. statementList *StatementListNode
  7186. )
  7187. // ebnf.Sequence TypeSwitchCase ":" StatementList ctx [CASE, DEFAULT]
  7188. {
  7189. p.openScope()
  7190. defer p.closeScope()
  7191. ix := p.ix
  7192. // *ebnf.Name TypeSwitchCase ctx [CASE, DEFAULT]
  7193. if typeSwitchCase = p.typeSwitchCase(); typeSwitchCase == nil {
  7194. p.back(ix)
  7195. return nil
  7196. }
  7197. // *ebnf.Token ":" ctx []
  7198. if colonTok, ok = p.accept(COLON); !ok {
  7199. p.back(ix)
  7200. return nil
  7201. }
  7202. // *ebnf.Name StatementList ctx []
  7203. switch p.c() {
  7204. case ADD, AND, ARROW, BREAK, CHAN, CHAR, CONST, CONTINUE, DEFER, FALLTHROUGH, FLOAT, FOR, FUNC, GO, GOTO, IDENT, IF, IMAG, INT, INTERFACE, LBRACE, LBRACK, LPAREN, MAP, MUL, NOT, RETURN, SELECT, SEMICOLON, STRING, STRUCT, SUB, SWITCH, TYPE, VAR, XOR /* ε */ :
  7205. if statementList = p.statementList(); statementList == nil {
  7206. p.back(ix)
  7207. return nil
  7208. }
  7209. }
  7210. }
  7211. return &TypeCaseClauseNode{
  7212. TypeSwitchCase: typeSwitchCase,
  7213. COLON: colonTok,
  7214. StatementList: statementList,
  7215. }
  7216. }
  7217. // TypeConstraintNode represents the production
  7218. //
  7219. // TypeConstraint = TypeElem .
  7220. type TypeConstraintNode struct {
  7221. TypeElem *TypeElemListNode
  7222. }
  7223. // Source implements Node.
  7224. func (n *TypeConstraintNode) Source(full bool) string { return nodeSource(n, full) }
  7225. // Position implements Node.
  7226. func (n *TypeConstraintNode) Position() (r token.Position) {
  7227. if n == nil {
  7228. return r
  7229. }
  7230. return n.TypeElem.Position()
  7231. }
  7232. func (p *parser) typeConstraint() *TypeConstraintNode {
  7233. var (
  7234. typeElem *TypeElemListNode
  7235. )
  7236. // *ebnf.Name TypeElem ctx [ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT, TILDE]
  7237. if typeElem = p.typeElem(); typeElem == nil {
  7238. return nil
  7239. }
  7240. return &TypeConstraintNode{
  7241. TypeElem: typeElem,
  7242. }
  7243. }
  7244. // TypeSpecListNode represents the production
  7245. //
  7246. // TypeSpecListNode = "type" ( TypeSpec | "(" { TypeSpec ";" } ")" ) .
  7247. type TypeSpecListNode struct {
  7248. TypeSpec Node
  7249. SEMICOLON Token
  7250. List *TypeSpecListNode
  7251. }
  7252. // Source implements Node.
  7253. func (n *TypeSpecListNode) Source(full bool) string { return nodeSource(n, full) }
  7254. // Position implements Node.
  7255. func (n *TypeSpecListNode) Position() (r token.Position) {
  7256. if n == nil {
  7257. return r
  7258. }
  7259. return n.TypeSpec.Position()
  7260. }
  7261. // TypeDeclNode represents the production
  7262. //
  7263. // TypeDecl = "type" ( TypeSpec | "(" { TypeSpec ";" } ")" ) .
  7264. type TypeDeclNode struct {
  7265. TYPE Token
  7266. LPAREN Token
  7267. TypeSpecList *TypeSpecListNode
  7268. RPAREN Token
  7269. }
  7270. // Source implements Node.
  7271. func (n *TypeDeclNode) Source(full bool) string { return nodeSource(n, full) }
  7272. // Position implements Node.
  7273. func (n *TypeDeclNode) Position() (r token.Position) {
  7274. if n == nil {
  7275. return r
  7276. }
  7277. return n.TYPE.Position()
  7278. }
  7279. func (p *parser) typeDecl() *TypeDeclNode {
  7280. var (
  7281. ok bool
  7282. typeTok Token
  7283. typeSpec Node
  7284. lparenTok Token
  7285. list, last *TypeSpecListNode
  7286. rparenTok Token
  7287. )
  7288. // ebnf.Sequence "type" ( TypeSpec | "(" { TypeSpec ";" } ")" ) ctx [TYPE]
  7289. {
  7290. switch p.peek(1) {
  7291. case IDENT, LPAREN:
  7292. default:
  7293. return nil
  7294. }
  7295. ix := p.ix
  7296. // *ebnf.Token "type" ctx [TYPE]
  7297. typeTok = p.expect(TYPE)
  7298. // *ebnf.Group ( TypeSpec | "(" { TypeSpec ";" } ")" ) ctx [IDENT, LPAREN]
  7299. // ebnf.Alternative TypeSpec | "(" { TypeSpec ";" } ")" ctx [IDENT, LPAREN]
  7300. switch p.c() {
  7301. case IDENT: // 0
  7302. // *ebnf.Name TypeSpec ctx [IDENT]
  7303. if typeSpec = p.typeSpec(); typeSpec == nil {
  7304. goto _0
  7305. }
  7306. list = &TypeSpecListNode{
  7307. TypeSpec: typeSpec,
  7308. }
  7309. break
  7310. _0:
  7311. typeSpec = nil
  7312. p.back(ix)
  7313. return nil
  7314. case LPAREN: // 1
  7315. // ebnf.Sequence "(" { TypeSpec ";" } ")" ctx [LPAREN]
  7316. {
  7317. ix := p.ix
  7318. // *ebnf.Token "(" ctx [LPAREN]
  7319. lparenTok = p.expect(LPAREN)
  7320. // *ebnf.Repetition { TypeSpec ";" } ctx []
  7321. _4:
  7322. {
  7323. var typeSpec Node
  7324. var semicolonTok Token
  7325. switch p.c() {
  7326. case IDENT:
  7327. // ebnf.Sequence TypeSpec ";" ctx [IDENT]
  7328. ix := p.ix
  7329. // *ebnf.Name TypeSpec ctx [IDENT]
  7330. if typeSpec = p.typeSpec(); typeSpec == nil {
  7331. p.back(ix)
  7332. goto _5
  7333. }
  7334. // *ebnf.Token ";" ctx []
  7335. if semicolonTok, ok = p.accept(SEMICOLON); !ok {
  7336. p.back(ix)
  7337. goto _5
  7338. }
  7339. next := &TypeSpecListNode{
  7340. TypeSpec: typeSpec,
  7341. SEMICOLON: semicolonTok,
  7342. }
  7343. if last != nil {
  7344. last.List = next
  7345. }
  7346. if list == nil {
  7347. list = next
  7348. }
  7349. last = next
  7350. goto _4
  7351. }
  7352. _5:
  7353. }
  7354. // *ebnf.Token ")" ctx []
  7355. if rparenTok, ok = p.accept(RPAREN); !ok {
  7356. p.back(ix)
  7357. goto _2
  7358. }
  7359. }
  7360. break
  7361. _2:
  7362. lparenTok = Token{}
  7363. rparenTok = Token{}
  7364. p.back(ix)
  7365. return nil
  7366. default:
  7367. p.back(ix)
  7368. return nil
  7369. }
  7370. }
  7371. return &TypeDeclNode{
  7372. TYPE: typeTok,
  7373. LPAREN: lparenTok,
  7374. TypeSpecList: list,
  7375. RPAREN: rparenTok,
  7376. }
  7377. }
  7378. // TypeDefNode represents the production
  7379. //
  7380. // TypeDef = identifier [ TypeParameters ] Type .
  7381. type TypeDefNode struct {
  7382. IDENT Token
  7383. TypeParameters *TypeParametersNode
  7384. TypeNode Type
  7385. pkg *Package
  7386. visible
  7387. }
  7388. // Source implements Node.
  7389. func (n *TypeDefNode) Source(full bool) string { return nodeSource(n, full) }
  7390. // Position implements Node.
  7391. func (n *TypeDefNode) Position() (r token.Position) {
  7392. if n == nil {
  7393. return r
  7394. }
  7395. return n.IDENT.Position()
  7396. }
  7397. func (p *parser) typeDef() (r *TypeDefNode) {
  7398. var (
  7399. identTok Token
  7400. typeParameters *TypeParametersNode
  7401. typeNode Type
  7402. )
  7403. // ebnf.Sequence identifier [ TypeParameters ] Type ctx [IDENT]
  7404. {
  7405. ix := p.ix
  7406. // *ebnf.Name identifier ctx [IDENT]
  7407. identTok = p.expect(IDENT)
  7408. // *ebnf.Option [ TypeParameters ] ctx []
  7409. switch p.c() {
  7410. case LBRACK:
  7411. // *ebnf.Name TypeParameters ctx [LBRACK]
  7412. if typeParameters = p.typeParameters(); typeParameters == nil {
  7413. goto _0
  7414. }
  7415. }
  7416. goto _1
  7417. _0:
  7418. typeParameters = nil
  7419. _1:
  7420. // *ebnf.Name Type ctx []
  7421. switch p.c() {
  7422. case ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT:
  7423. if typeNode = p.type1(); typeNode == nil {
  7424. p.back(ix)
  7425. return nil
  7426. }
  7427. default:
  7428. p.back(ix)
  7429. return nil
  7430. }
  7431. }
  7432. r = &TypeDefNode{
  7433. IDENT: identTok,
  7434. TypeParameters: typeParameters,
  7435. TypeNode: typeNode,
  7436. }
  7437. p.declare(p.sc, identTok, r, int32(p.ix), false)
  7438. return r
  7439. }
  7440. // TypeElemListNode represents the production
  7441. //
  7442. // TypeElem = TypeTerm { "|" TypeTerm } .
  7443. type TypeElemListNode struct {
  7444. OR Token
  7445. TypeTerm *TypeTermNode
  7446. List *TypeElemListNode
  7447. }
  7448. // Source implements Node.
  7449. func (n *TypeElemListNode) Source(full bool) string { return nodeSource(n, full) }
  7450. // Position implements Node.
  7451. func (n *TypeElemListNode) Position() (r token.Position) {
  7452. if n == nil {
  7453. return r
  7454. }
  7455. if n.OR.IsValid() {
  7456. return n.OR.Position()
  7457. }
  7458. return n.TypeTerm.Position()
  7459. }
  7460. func (p *parser) typeElem() *TypeElemListNode {
  7461. var (
  7462. typeTerm *TypeTermNode
  7463. list, last *TypeElemListNode
  7464. )
  7465. // ebnf.Sequence TypeTerm { "|" TypeTerm } ctx [ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT, TILDE]
  7466. {
  7467. ix := p.ix
  7468. // *ebnf.Name TypeTerm ctx [ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT, TILDE]
  7469. if typeTerm = p.typeTerm(); typeTerm == nil {
  7470. p.back(ix)
  7471. return nil
  7472. }
  7473. list = &TypeElemListNode{
  7474. TypeTerm: typeTerm,
  7475. }
  7476. last = list
  7477. // *ebnf.Repetition { "|" TypeTerm } ctx []
  7478. _0:
  7479. {
  7480. var orTok Token
  7481. var typeTerm *TypeTermNode
  7482. switch p.c() {
  7483. case OR:
  7484. // ebnf.Sequence "|" TypeTerm ctx [OR]
  7485. switch p.peek(1) {
  7486. case ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT, TILDE:
  7487. default:
  7488. goto _1
  7489. }
  7490. ix := p.ix
  7491. // *ebnf.Token "|" ctx [OR]
  7492. orTok = p.expect(OR)
  7493. // *ebnf.Name TypeTerm ctx [ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT, TILDE]
  7494. if typeTerm = p.typeTerm(); typeTerm == nil {
  7495. p.back(ix)
  7496. goto _1
  7497. }
  7498. next := &TypeElemListNode{
  7499. OR: orTok,
  7500. TypeTerm: typeTerm,
  7501. }
  7502. last.List = next
  7503. last = next
  7504. goto _0
  7505. }
  7506. _1:
  7507. }
  7508. }
  7509. return list
  7510. }
  7511. // TypeListNode represents the production
  7512. //
  7513. // TypeList = Type { "," Type } .
  7514. type TypeListNode struct {
  7515. COMMA Token
  7516. TypeNode Type
  7517. List *TypeListNode
  7518. }
  7519. // Source implements Node.
  7520. func (n *TypeListNode) Source(full bool) string { return nodeSource(n, full) }
  7521. // Position implements Node.
  7522. func (n *TypeListNode) Position() (r token.Position) {
  7523. if n == nil {
  7524. return r
  7525. }
  7526. if n.COMMA.IsValid() {
  7527. return n.COMMA.Position()
  7528. }
  7529. return n.TypeNode.Position()
  7530. }
  7531. func (p *parser) typeList() *TypeListNode {
  7532. var (
  7533. typeNode Type
  7534. list, last *TypeListNode
  7535. )
  7536. // ebnf.Sequence Type { "," Type } ctx [ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT]
  7537. {
  7538. ix := p.ix
  7539. // *ebnf.Name Type ctx [ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT]
  7540. if typeNode = p.type1(); typeNode == nil {
  7541. p.back(ix)
  7542. return nil
  7543. }
  7544. list = &TypeListNode{
  7545. TypeNode: typeNode,
  7546. }
  7547. last = list
  7548. // *ebnf.Repetition { "," Type } ctx []
  7549. _0:
  7550. {
  7551. var commaTok Token
  7552. var typeNode Type
  7553. switch p.c() {
  7554. case COMMA:
  7555. // ebnf.Sequence "," Type ctx [COMMA]
  7556. switch p.peek(1) {
  7557. case ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT:
  7558. default:
  7559. goto _1
  7560. }
  7561. ix := p.ix
  7562. // *ebnf.Token "," ctx [COMMA]
  7563. commaTok = p.expect(COMMA)
  7564. // *ebnf.Name Type ctx [ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT]
  7565. if typeNode = p.type1(); typeNode == nil {
  7566. p.back(ix)
  7567. goto _1
  7568. }
  7569. next := &TypeListNode{
  7570. COMMA: commaTok,
  7571. TypeNode: typeNode,
  7572. }
  7573. last.List = next
  7574. last = next
  7575. goto _0
  7576. }
  7577. _1:
  7578. }
  7579. }
  7580. return list
  7581. }
  7582. func (p *parser) typeLit() Type {
  7583. var (
  7584. arrayType *ArrayTypeNode
  7585. structType *StructTypeNode
  7586. pointerType *PointerTypeNode
  7587. functionType *FunctionTypeNode
  7588. interfaceType *InterfaceTypeNode
  7589. mapType *MapTypeNode
  7590. channelType *ChannelTypeNode
  7591. )
  7592. // ebnf.Alternative ArrayType | StructType | PointerType | FunctionType | InterfaceType | SliceType | MapType | ChannelType ctx [ARROW, CHAN, FUNC, INTERFACE, LBRACK, MAP, MUL, STRUCT]
  7593. switch p.c() {
  7594. case LBRACK: // 0 5
  7595. if p.peek(1) == RBRACK {
  7596. return p.sliceType()
  7597. }
  7598. // *ebnf.Name ArrayType ctx [LBRACK]
  7599. if arrayType = p.arrayType(); arrayType != nil {
  7600. return arrayType
  7601. }
  7602. case STRUCT: // 1
  7603. // *ebnf.Name StructType ctx [STRUCT]
  7604. if structType = p.structType(); structType != nil {
  7605. return structType
  7606. }
  7607. case MUL: // 2
  7608. // *ebnf.Name PointerType ctx [MUL]
  7609. if pointerType = p.pointerType(); pointerType != nil {
  7610. return pointerType
  7611. }
  7612. case FUNC: // 3
  7613. // *ebnf.Name FunctionType ctx [FUNC]
  7614. if functionType = p.functionType(); functionType != nil {
  7615. return functionType
  7616. }
  7617. case INTERFACE: // 4
  7618. // *ebnf.Name InterfaceType ctx [INTERFACE]
  7619. if interfaceType = p.interfaceType(); interfaceType != nil {
  7620. return interfaceType
  7621. }
  7622. case MAP: // 6
  7623. // *ebnf.Name MapType ctx [MAP]
  7624. if mapType = p.mapType(); mapType != nil {
  7625. return mapType
  7626. }
  7627. case ARROW, CHAN: // 7
  7628. // *ebnf.Name ChannelType ctx [ARROW, CHAN]
  7629. if channelType = p.channelType(); channelType != nil {
  7630. return channelType
  7631. }
  7632. }
  7633. return nil
  7634. }
  7635. // TypeNameNode represents the production
  7636. //
  7637. // TypeName = QualifiedIdent | identifier .
  7638. type TypeNameNode struct {
  7639. Name Node
  7640. lexicalScoper
  7641. }
  7642. // Source implements Node.
  7643. func (n *TypeNameNode) Source(full bool) string { return nodeSource(n, full) }
  7644. // Position implements Node.
  7645. func (n *TypeNameNode) Position() (r token.Position) {
  7646. if n == nil || n.Name == nil {
  7647. return r
  7648. }
  7649. return n.Name.Position()
  7650. }
  7651. func (p *parser) typeName() *TypeNameNode {
  7652. var (
  7653. qualifiedIdent *QualifiedIdentNode
  7654. )
  7655. // ebnf.Alternative QualifiedIdent | identifier ctx [IDENT]
  7656. switch p.c() {
  7657. case IDENT: // 0 1
  7658. // *ebnf.Name QualifiedIdent ctx [IDENT]
  7659. if qualifiedIdent = p.qualifiedIdent(); qualifiedIdent != nil {
  7660. return &TypeNameNode{
  7661. Name: qualifiedIdent,
  7662. lexicalScoper: newLexicalScoper(p.sc),
  7663. }
  7664. }
  7665. // *ebnf.Name identifier ctx [IDENT]
  7666. return &TypeNameNode{
  7667. Name: p.expect(IDENT),
  7668. lexicalScoper: newLexicalScoper(p.sc),
  7669. }
  7670. default:
  7671. return nil
  7672. }
  7673. }
  7674. // TypeParamDeclNode represents the production
  7675. //
  7676. // TypeParamDecl = IdentifierList TypeConstraint .
  7677. type TypeParamDeclNode struct {
  7678. IdentifierList *IdentifierListNode
  7679. TypeConstraint *TypeConstraintNode
  7680. }
  7681. // Source implements Node.
  7682. func (n *TypeParamDeclNode) Source(full bool) string { return nodeSource(n, full) }
  7683. // Position implements Node.
  7684. func (n *TypeParamDeclNode) Position() (r token.Position) {
  7685. if n == nil {
  7686. return r
  7687. }
  7688. return n.IdentifierList.Position()
  7689. }
  7690. func (p *parser) typeParamDecl() *TypeParamDeclNode {
  7691. var (
  7692. identifierList *IdentifierListNode
  7693. typeConstraint *TypeConstraintNode
  7694. )
  7695. // ebnf.Sequence IdentifierList TypeConstraint ctx [IDENT]
  7696. {
  7697. ix := p.ix
  7698. // *ebnf.Name IdentifierList ctx [IDENT]
  7699. if identifierList = p.identifierList(); identifierList == nil {
  7700. p.back(ix)
  7701. return nil
  7702. }
  7703. // *ebnf.Name TypeConstraint ctx []
  7704. switch p.c() {
  7705. case ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT, TILDE:
  7706. if typeConstraint = p.typeConstraint(); typeConstraint == nil {
  7707. p.back(ix)
  7708. return nil
  7709. }
  7710. default:
  7711. p.back(ix)
  7712. return nil
  7713. }
  7714. }
  7715. return &TypeParamDeclNode{
  7716. IdentifierList: identifierList,
  7717. TypeConstraint: typeConstraint,
  7718. }
  7719. }
  7720. // TypeParamListNode represents the production
  7721. //
  7722. // TypeParamList = TypeParamDecl { "," TypeParamDecl } .
  7723. type TypeParamListNode struct {
  7724. COMMA Token
  7725. TypeParamDecl *TypeParamDeclNode
  7726. List *TypeParamListNode
  7727. }
  7728. // Source implements Node.
  7729. func (n *TypeParamListNode) Source(full bool) string { return nodeSource(n, full) }
  7730. // Position implements Node.
  7731. func (n *TypeParamListNode) Position() (r token.Position) {
  7732. if n == nil {
  7733. return r
  7734. }
  7735. return n.TypeParamDecl.Position()
  7736. }
  7737. func (p *parser) typeParamList() *TypeParamListNode {
  7738. var (
  7739. typeParamDecl *TypeParamDeclNode
  7740. list, last *TypeParamListNode
  7741. )
  7742. // ebnf.Sequence TypeParamDecl { "," TypeParamDecl } ctx [IDENT]
  7743. {
  7744. ix := p.ix
  7745. // *ebnf.Name TypeParamDecl ctx [IDENT]
  7746. if typeParamDecl = p.typeParamDecl(); typeParamDecl == nil {
  7747. p.back(ix)
  7748. return nil
  7749. }
  7750. list = &TypeParamListNode{
  7751. TypeParamDecl: typeParamDecl,
  7752. }
  7753. last = list
  7754. // *ebnf.Repetition { "," TypeParamDecl } ctx []
  7755. _0:
  7756. {
  7757. var commaTok Token
  7758. var typeParamDecl *TypeParamDeclNode
  7759. switch p.c() {
  7760. case COMMA:
  7761. // ebnf.Sequence "," TypeParamDecl ctx [COMMA]
  7762. switch p.peek(1) {
  7763. case IDENT:
  7764. default:
  7765. goto _1
  7766. }
  7767. ix := p.ix
  7768. // *ebnf.Token "," ctx [COMMA]
  7769. commaTok = p.expect(COMMA)
  7770. // *ebnf.Name TypeParamDecl ctx [IDENT]
  7771. if typeParamDecl = p.typeParamDecl(); typeParamDecl == nil {
  7772. p.back(ix)
  7773. goto _1
  7774. }
  7775. next := &TypeParamListNode{
  7776. COMMA: commaTok,
  7777. TypeParamDecl: typeParamDecl,
  7778. }
  7779. last.List = next
  7780. last = next
  7781. goto _0
  7782. }
  7783. _1:
  7784. }
  7785. }
  7786. return list
  7787. }
  7788. // TypeParametersNode represents the production
  7789. //
  7790. // TypeParameters = "[" TypeParamList [ "," ] "]" .
  7791. type TypeParametersNode struct {
  7792. LBRACK Token
  7793. TypeParamList *TypeParamListNode
  7794. COMMA Token
  7795. RBRACK Token
  7796. }
  7797. // Source implements Node.
  7798. func (n *TypeParametersNode) Source(full bool) string { return nodeSource(n, full) }
  7799. // Position implements Node.
  7800. func (n *TypeParametersNode) Position() (r token.Position) {
  7801. if n == nil {
  7802. return r
  7803. }
  7804. return n.LBRACK.Position()
  7805. }
  7806. func (p *parser) typeParameters() *TypeParametersNode {
  7807. var (
  7808. ok bool
  7809. lbrackTok Token
  7810. typeParamList *TypeParamListNode
  7811. commaTok Token
  7812. rbrackTok Token
  7813. )
  7814. // ebnf.Sequence "[" TypeParamList [ "," ] "]" ctx [LBRACK]
  7815. {
  7816. switch p.peek(1) {
  7817. case IDENT:
  7818. default:
  7819. return nil
  7820. }
  7821. ix := p.ix
  7822. // *ebnf.Token "[" ctx [LBRACK]
  7823. lbrackTok = p.expect(LBRACK)
  7824. // *ebnf.Name TypeParamList ctx [IDENT]
  7825. if typeParamList = p.typeParamList(); typeParamList == nil {
  7826. p.back(ix)
  7827. return nil
  7828. }
  7829. // *ebnf.Option [ "," ] ctx []
  7830. switch p.c() {
  7831. case COMMA:
  7832. // *ebnf.Token "," ctx [COMMA]
  7833. commaTok = p.expect(COMMA)
  7834. }
  7835. // *ebnf.Token "]" ctx []
  7836. if rbrackTok, ok = p.accept(RBRACK); !ok {
  7837. p.back(ix)
  7838. return nil
  7839. }
  7840. }
  7841. return &TypeParametersNode{
  7842. LBRACK: lbrackTok,
  7843. TypeParamList: typeParamList,
  7844. COMMA: commaTok,
  7845. RBRACK: rbrackTok,
  7846. }
  7847. }
  7848. func (p *parser) typeSpec() Node {
  7849. var (
  7850. aliasDecl *AliasDeclNode
  7851. typeDef *TypeDefNode
  7852. )
  7853. // ebnf.Alternative AliasDecl | TypeDef ctx [IDENT]
  7854. switch p.c() {
  7855. case IDENT: // 0 1
  7856. // *ebnf.Name AliasDecl ctx [IDENT]
  7857. if aliasDecl = p.aliasDecl(); aliasDecl == nil {
  7858. goto _0
  7859. }
  7860. return aliasDecl
  7861. _0:
  7862. aliasDecl = nil
  7863. // *ebnf.Name TypeDef ctx [IDENT]
  7864. if typeDef = p.typeDef(); typeDef == nil {
  7865. return nil
  7866. }
  7867. return typeDef
  7868. default:
  7869. return nil
  7870. }
  7871. }
  7872. // TypeSwitchCaseNode represents the production
  7873. //
  7874. // TypeSwitchCase = "case" TypeList | "default" .
  7875. type TypeSwitchCaseNode struct {
  7876. CASE Token
  7877. TypeList *TypeListNode
  7878. DEFAULT Token
  7879. }
  7880. // Source implements Node.
  7881. func (n *TypeSwitchCaseNode) Source(full bool) string { return nodeSource(n, full) }
  7882. // Position implements Node.
  7883. func (n *TypeSwitchCaseNode) Position() (r token.Position) {
  7884. if n == nil {
  7885. return r
  7886. }
  7887. panic("TODO")
  7888. }
  7889. func (p *parser) typeSwitchCase() *TypeSwitchCaseNode {
  7890. var (
  7891. caseTok Token
  7892. typeList *TypeListNode
  7893. defaultTok Token
  7894. )
  7895. // ebnf.Alternative "case" TypeList | "default" ctx [CASE, DEFAULT]
  7896. switch p.c() {
  7897. case CASE: // 0
  7898. // ebnf.Sequence "case" TypeList ctx [CASE]
  7899. {
  7900. switch p.peek(1) {
  7901. case ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT:
  7902. default:
  7903. goto _0
  7904. }
  7905. ix := p.ix
  7906. // *ebnf.Token "case" ctx [CASE]
  7907. caseTok = p.expect(CASE)
  7908. // *ebnf.Name TypeList ctx [ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT]
  7909. if typeList = p.typeList(); typeList == nil {
  7910. p.back(ix)
  7911. goto _0
  7912. }
  7913. }
  7914. break
  7915. _0:
  7916. caseTok = Token{}
  7917. typeList = nil
  7918. return nil
  7919. case DEFAULT: // 1
  7920. // *ebnf.Token "default" ctx [DEFAULT]
  7921. defaultTok = p.expect(DEFAULT)
  7922. default:
  7923. return nil
  7924. }
  7925. return &TypeSwitchCaseNode{
  7926. CASE: caseTok,
  7927. TypeList: typeList,
  7928. DEFAULT: defaultTok,
  7929. }
  7930. }
  7931. // TypeSwitchGuardNode represents the production
  7932. //
  7933. // TypeSwitchGuard = [ identifier ":=" ] PrimaryExpr "." "(" "type" ")" .
  7934. type TypeSwitchGuardNode struct {
  7935. IDENT Token
  7936. DEFINE Token
  7937. PrimaryExpr Expression
  7938. PERIOD Token
  7939. LPAREN Token
  7940. TYPE Token
  7941. RPAREN Token
  7942. }
  7943. // Source implements Node.
  7944. func (n *TypeSwitchGuardNode) Source(full bool) string { return nodeSource(n, full) }
  7945. // Position implements Node.
  7946. func (n *TypeSwitchGuardNode) Position() (r token.Position) {
  7947. if n == nil {
  7948. return r
  7949. }
  7950. panic("TODO")
  7951. }
  7952. func (p *parser) typeSwitchGuard() *TypeSwitchGuardNode {
  7953. var (
  7954. ok bool
  7955. identTok Token
  7956. defineTok Token
  7957. primaryExpr Expression
  7958. periodTok Token
  7959. lparenTok Token
  7960. typeTok Token
  7961. rparenTok Token
  7962. )
  7963. // ebnf.Sequence [ identifier ":=" ] PrimaryExpr "." "(" "type" ")" ctx [ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRING, STRUCT]
  7964. {
  7965. ix := p.ix
  7966. // *ebnf.Option [ identifier ":=" ] ctx [ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRING, STRUCT]
  7967. switch p.c() {
  7968. case IDENT:
  7969. // ebnf.Sequence identifier ":=" ctx [IDENT]
  7970. {
  7971. if p.peek(1) != DEFINE {
  7972. goto _0
  7973. }
  7974. // *ebnf.Name identifier ctx [IDENT]
  7975. identTok = p.expect(IDENT)
  7976. // *ebnf.Token ":=" ctx [DEFINE]
  7977. defineTok = p.expect(DEFINE)
  7978. }
  7979. }
  7980. goto _1
  7981. _0:
  7982. defineTok = Token{}
  7983. identTok = Token{}
  7984. _1:
  7985. // *ebnf.Name PrimaryExpr ctx []
  7986. switch p.c() {
  7987. case ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRING, STRUCT:
  7988. if primaryExpr = p.primaryExpr(false); primaryExpr == nil {
  7989. p.back(ix)
  7990. return nil
  7991. }
  7992. default:
  7993. p.back(ix)
  7994. return nil
  7995. }
  7996. // *ebnf.Token "." ctx []
  7997. if periodTok, ok = p.accept(PERIOD); !ok {
  7998. p.back(ix)
  7999. return nil
  8000. }
  8001. // *ebnf.Token "(" ctx []
  8002. if lparenTok, ok = p.accept(LPAREN); !ok {
  8003. p.back(ix)
  8004. return nil
  8005. }
  8006. // *ebnf.Token "type" ctx []
  8007. if typeTok, ok = p.accept(TYPE); !ok {
  8008. p.back(ix)
  8009. return nil
  8010. }
  8011. // *ebnf.Token ")" ctx []
  8012. if rparenTok, ok = p.accept(RPAREN); !ok {
  8013. p.back(ix)
  8014. return nil
  8015. }
  8016. }
  8017. return &TypeSwitchGuardNode{
  8018. IDENT: identTok,
  8019. DEFINE: defineTok,
  8020. PrimaryExpr: primaryExpr,
  8021. PERIOD: periodTok,
  8022. LPAREN: lparenTok,
  8023. TYPE: typeTok,
  8024. RPAREN: rparenTok,
  8025. }
  8026. }
  8027. // TypeCaseClauseListNode represents the production
  8028. //
  8029. // TypeCaseClauseListNode = { TypeCaseClause } .
  8030. type TypeCaseClauseListNode struct {
  8031. TypeCaseClause *TypeCaseClauseNode
  8032. List *TypeCaseClauseListNode
  8033. }
  8034. // Source implements Node.
  8035. func (n *TypeCaseClauseListNode) Source(full bool) string { return nodeSource(n, full) }
  8036. // Position implements Node.
  8037. func (n *TypeCaseClauseListNode) Position() (r token.Position) {
  8038. if n == nil {
  8039. return r
  8040. }
  8041. return n.TypeCaseClause.Position()
  8042. }
  8043. // TypeSwitchStmtNode represents the production
  8044. //
  8045. // TypeSwitchStmt = "switch" [ SimpleStmt ";" ] TypeSwitchGuard "{" { TypeCaseClause } "}" .
  8046. type TypeSwitchStmtNode struct {
  8047. SWITCH Token
  8048. SimpleStmt Node
  8049. SEMICOLON Token
  8050. TypeSwitchGuard *TypeSwitchGuardNode
  8051. LBRACE Token
  8052. TypeCaseClauseList *TypeCaseClauseListNode
  8053. RBRACE Token
  8054. }
  8055. // Source implements Node.
  8056. func (n *TypeSwitchStmtNode) Source(full bool) string { return nodeSource(n, full) }
  8057. // Position implements Node.
  8058. func (n *TypeSwitchStmtNode) Position() (r token.Position) {
  8059. if n == nil {
  8060. return r
  8061. }
  8062. return n.SWITCH.Position()
  8063. }
  8064. func (p *parser) typeSwitchStmt() *TypeSwitchStmtNode {
  8065. var (
  8066. ok bool
  8067. switchTok Token
  8068. simpleStmt Node
  8069. semicolonTok Token
  8070. typeSwitchGuard *TypeSwitchGuardNode
  8071. lbraceTok Token
  8072. list, last *TypeCaseClauseListNode
  8073. rbraceTok Token
  8074. )
  8075. // ebnf.Sequence "switch" [ SimpleStmt ";" ] TypeSwitchGuard "{" { TypeCaseClause } "}" ctx [SWITCH]
  8076. {
  8077. ix := p.ix
  8078. // *ebnf.Token "switch" ctx [SWITCH]
  8079. switchTok = p.expect(SWITCH)
  8080. // *ebnf.Option [ SimpleStmt ";" ] ctx []
  8081. switch p.c() {
  8082. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, SEMICOLON, STRING, STRUCT, SUB, XOR:
  8083. // ebnf.Sequence SimpleStmt ";" ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, SEMICOLON, STRING, STRUCT, SUB, XOR]
  8084. {
  8085. ix := p.ix
  8086. // *ebnf.Name SimpleStmt ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, SEMICOLON, STRING, STRUCT, SUB, XOR]
  8087. switch p.c() {
  8088. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  8089. if simpleStmt = p.simpleStmt(false); simpleStmt == nil {
  8090. p.back(ix)
  8091. goto _0
  8092. }
  8093. default:
  8094. p.back(ix)
  8095. goto _0
  8096. }
  8097. // *ebnf.Token ";" ctx []
  8098. if semicolonTok, ok = p.accept(SEMICOLON); !ok {
  8099. p.back(ix)
  8100. goto _0
  8101. }
  8102. }
  8103. }
  8104. goto _1
  8105. _0:
  8106. semicolonTok = Token{}
  8107. simpleStmt = nil
  8108. _1:
  8109. // *ebnf.Name TypeSwitchGuard ctx []
  8110. switch p.c() {
  8111. case ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRING, STRUCT:
  8112. if typeSwitchGuard = p.typeSwitchGuard(); typeSwitchGuard == nil {
  8113. p.back(ix)
  8114. return nil
  8115. }
  8116. default:
  8117. p.back(ix)
  8118. return nil
  8119. }
  8120. // *ebnf.Token "{" ctx []
  8121. if lbraceTok, ok = p.accept(LBRACE); !ok {
  8122. p.back(ix)
  8123. return nil
  8124. }
  8125. // *ebnf.Repetition { TypeCaseClause } ctx []
  8126. _2:
  8127. {
  8128. var typeCaseClause *TypeCaseClauseNode
  8129. switch p.c() {
  8130. case CASE, DEFAULT:
  8131. // *ebnf.Name TypeCaseClause ctx [CASE, DEFAULT]
  8132. if typeCaseClause = p.typeCaseClause(); typeCaseClause == nil {
  8133. goto _3
  8134. }
  8135. next := &TypeCaseClauseListNode{
  8136. TypeCaseClause: typeCaseClause,
  8137. }
  8138. if last != nil {
  8139. last.List = next
  8140. }
  8141. if list == nil {
  8142. list = next
  8143. }
  8144. last = next
  8145. goto _2
  8146. }
  8147. _3:
  8148. }
  8149. // *ebnf.Token "}" ctx []
  8150. if rbraceTok, ok = p.accept(RBRACE); !ok {
  8151. p.back(ix)
  8152. return nil
  8153. }
  8154. }
  8155. return &TypeSwitchStmtNode{
  8156. SWITCH: switchTok,
  8157. SimpleStmt: simpleStmt,
  8158. SEMICOLON: semicolonTok,
  8159. TypeSwitchGuard: typeSwitchGuard,
  8160. LBRACE: lbraceTok,
  8161. TypeCaseClauseList: list,
  8162. RBRACE: rbraceTok,
  8163. }
  8164. }
  8165. // TypeTermNode represents the production
  8166. //
  8167. // TypeTerm = Type | UnderlyingType .
  8168. type TypeTermNode struct {
  8169. TypeNode Type
  8170. UnderlyingType *UnderlyingTypeNode
  8171. }
  8172. // Source implements Node.
  8173. func (n *TypeTermNode) Source(full bool) string { return nodeSource(n, full) }
  8174. // Position implements Node.
  8175. func (n *TypeTermNode) Position() (r token.Position) {
  8176. if n == nil {
  8177. return r
  8178. }
  8179. if n.TypeNode != nil {
  8180. return n.TypeNode.Position()
  8181. }
  8182. return n.UnderlyingType.Position()
  8183. }
  8184. func (p *parser) typeTerm() *TypeTermNode {
  8185. var (
  8186. typeNode Type
  8187. underlyingType *UnderlyingTypeNode
  8188. )
  8189. // ebnf.Alternative Type | UnderlyingType ctx [ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT, TILDE]
  8190. switch p.c() {
  8191. case ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT: // 0
  8192. // *ebnf.Name Type ctx [ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT]
  8193. if typeNode = p.type1(); typeNode == nil {
  8194. goto _0
  8195. }
  8196. break
  8197. _0:
  8198. typeNode = nil
  8199. return nil
  8200. case TILDE: // 1
  8201. // *ebnf.Name UnderlyingType ctx [TILDE]
  8202. if underlyingType = p.underlyingType(); underlyingType == nil {
  8203. goto _2
  8204. }
  8205. break
  8206. _2:
  8207. underlyingType = nil
  8208. return nil
  8209. default:
  8210. return nil
  8211. }
  8212. return &TypeTermNode{
  8213. TypeNode: typeNode,
  8214. UnderlyingType: underlyingType,
  8215. }
  8216. }
  8217. // UnaryExprNode represents the production
  8218. //
  8219. // UnaryExpr = PrimaryExpr | ( "+" | "-" | "!" | "^" | "*" | "&" | "<-" ) UnaryExpr .
  8220. type UnaryExprNode struct {
  8221. Op Token
  8222. UnaryExpr Expression
  8223. typeCache
  8224. valueCache
  8225. }
  8226. // Source implements Node.
  8227. func (n *UnaryExprNode) Source(full bool) string { return nodeSource(n, full) }
  8228. // Position implements Node.
  8229. func (n *UnaryExprNode) Position() (r token.Position) {
  8230. if n == nil {
  8231. return r
  8232. }
  8233. return n.Op.Position()
  8234. }
  8235. func (p *parser) unaryExpr(preBlock bool) Expression {
  8236. var (
  8237. primaryExpr Expression
  8238. op Token
  8239. unaryExpr Expression
  8240. )
  8241. // ebnf.Alternative PrimaryExpr | ( "+" | "-" | "!" | "^" | "*" | "&" | "<-" ) UnaryExpr ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  8242. switch p.c() {
  8243. case CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, STRING, STRUCT: // 0
  8244. // *ebnf.Name PrimaryExpr ctx [CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, STRING, STRUCT]
  8245. if primaryExpr = p.primaryExpr(preBlock); primaryExpr == nil {
  8246. return nil
  8247. }
  8248. return primaryExpr
  8249. case ARROW, MUL: // 0 1
  8250. // *ebnf.Name PrimaryExpr ctx [ARROW, MUL]
  8251. if primaryExpr = p.primaryExpr(preBlock); primaryExpr == nil {
  8252. goto _2
  8253. }
  8254. return primaryExpr
  8255. _2:
  8256. primaryExpr = nil
  8257. // ebnf.Sequence ( "+" | "-" | "!" | "^" | "*" | "&" | "<-" ) UnaryExpr ctx [ARROW, MUL]
  8258. {
  8259. ix := p.ix
  8260. // *ebnf.Group ( "+" | "-" | "!" | "^" | "*" | "&" | "<-" ) ctx [ARROW, MUL]
  8261. // ebnf.Alternative "+" | "-" | "!" | "^" | "*" | "&" | "<-" ctx [ARROW, MUL]
  8262. op = p.consume()
  8263. // *ebnf.Name UnaryExpr ctx []
  8264. switch p.c() {
  8265. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  8266. if unaryExpr = p.unaryExpr(preBlock); unaryExpr == nil {
  8267. p.back(ix)
  8268. goto _3
  8269. }
  8270. default:
  8271. p.back(ix)
  8272. goto _3
  8273. }
  8274. }
  8275. break
  8276. _3:
  8277. unaryExpr = nil
  8278. return nil
  8279. case ADD, AND, NOT, SUB, XOR: // 1
  8280. // ebnf.Sequence ( "+" | "-" | "!" | "^" | "*" | "&" | "<-" ) UnaryExpr ctx [ADD, AND, NOT, SUB, XOR]
  8281. {
  8282. ix := p.ix
  8283. // *ebnf.Group ( "+" | "-" | "!" | "^" | "*" | "&" | "<-" ) ctx [ADD, AND, NOT, SUB, XOR]
  8284. // ebnf.Alternative "+" | "-" | "!" | "^" | "*" | "&" | "<-" ctx [ADD, AND, NOT, SUB, XOR]
  8285. op = p.consume()
  8286. // *ebnf.Name UnaryExpr ctx []
  8287. switch p.c() {
  8288. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  8289. if unaryExpr = p.unaryExpr(preBlock); unaryExpr == nil {
  8290. p.back(ix)
  8291. goto _8
  8292. }
  8293. default:
  8294. p.back(ix)
  8295. goto _8
  8296. }
  8297. }
  8298. break
  8299. _8:
  8300. op = Token{}
  8301. unaryExpr = nil
  8302. return nil
  8303. default:
  8304. return nil
  8305. }
  8306. return &UnaryExprNode{
  8307. Op: op,
  8308. UnaryExpr: unaryExpr,
  8309. }
  8310. }
  8311. // UnderlyingTypeNode represents the production
  8312. //
  8313. // UnderlyingType = "~" Type .
  8314. type UnderlyingTypeNode struct {
  8315. TILDE Token
  8316. TypeNode Type
  8317. }
  8318. // Source implements Node.
  8319. func (n *UnderlyingTypeNode) Source(full bool) string { return nodeSource(n, full) }
  8320. // Position implements Node.
  8321. func (n *UnderlyingTypeNode) Position() (r token.Position) {
  8322. if n == nil {
  8323. return r
  8324. }
  8325. return n.TILDE.Position()
  8326. }
  8327. func (p *parser) underlyingType() *UnderlyingTypeNode {
  8328. var (
  8329. tildeTok Token
  8330. typeNode Type
  8331. )
  8332. // ebnf.Sequence "~" Type ctx [TILDE]
  8333. {
  8334. switch p.peek(1) {
  8335. case ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT:
  8336. default:
  8337. return nil
  8338. }
  8339. ix := p.ix
  8340. // *ebnf.Token "~" ctx [TILDE]
  8341. tildeTok = p.expect(TILDE)
  8342. // *ebnf.Name Type ctx [ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT]
  8343. if typeNode = p.type1(); typeNode == nil {
  8344. p.back(ix)
  8345. return nil
  8346. }
  8347. }
  8348. return &UnderlyingTypeNode{
  8349. TILDE: tildeTok,
  8350. TypeNode: typeNode,
  8351. }
  8352. }
  8353. // VarSpecListNode represents the production
  8354. //
  8355. // VarSpecListNode = { VarSpec ";" } .
  8356. type VarSpecListNode struct {
  8357. VarSpec Node
  8358. SEMICOLON Token
  8359. List *VarSpecListNode
  8360. }
  8361. // Source implements Node.
  8362. func (n *VarSpecListNode) Source(full bool) string { return nodeSource(n, full) }
  8363. // Position implements Node.
  8364. func (n *VarSpecListNode) Position() (r token.Position) {
  8365. if n == nil {
  8366. return r
  8367. }
  8368. return n.VarSpec.Position()
  8369. }
  8370. // VarDeclNode represents the production
  8371. //
  8372. // VarDecl = "var" ( VarSpec | "(" { VarSpec ";" } ")" ) .
  8373. type VarDeclNode struct {
  8374. VAR Token
  8375. LPAREN Token
  8376. VarSpec Node
  8377. RPAREN Token
  8378. }
  8379. // Source implements Node.
  8380. func (n *VarDeclNode) Source(full bool) string { return nodeSource(n, full) }
  8381. // Position implements Node.
  8382. func (n *VarDeclNode) Position() (r token.Position) {
  8383. if n == nil {
  8384. return r
  8385. }
  8386. return n.VAR.Position()
  8387. }
  8388. func (p *parser) varDecl() *VarDeclNode {
  8389. var (
  8390. ok bool
  8391. varTok Token
  8392. varSpec Node
  8393. lparenTok Token
  8394. list, last *VarSpecListNode
  8395. rparenTok Token
  8396. )
  8397. // ebnf.Sequence "var" ( VarSpec | "(" { VarSpec ";" } ")" ) ctx [VAR]
  8398. {
  8399. switch p.peek(1) {
  8400. case IDENT, LPAREN:
  8401. default:
  8402. return nil
  8403. }
  8404. ix := p.ix
  8405. // *ebnf.Token "var" ctx [VAR]
  8406. varTok = p.expect(VAR)
  8407. // *ebnf.Group ( VarSpec | "(" { VarSpec ";" } ")" ) ctx [IDENT, LPAREN]
  8408. // ebnf.Alternative VarSpec | "(" { VarSpec ";" } ")" ctx [IDENT, LPAREN]
  8409. switch p.c() {
  8410. case IDENT: // 0
  8411. // *ebnf.Name VarSpec ctx [IDENT]
  8412. if varSpec = p.varSpec(); varSpec == nil {
  8413. goto _0
  8414. }
  8415. list = &VarSpecListNode{
  8416. VarSpec: varSpec,
  8417. }
  8418. break
  8419. _0:
  8420. varSpec = nil
  8421. p.back(ix)
  8422. return nil
  8423. case LPAREN: // 1
  8424. // ebnf.Sequence "(" { VarSpec ";" } ")" ctx [LPAREN]
  8425. {
  8426. ix := p.ix
  8427. // *ebnf.Token "(" ctx [LPAREN]
  8428. lparenTok = p.expect(LPAREN)
  8429. // *ebnf.Repetition { VarSpec ";" } ctx []
  8430. _4:
  8431. {
  8432. var varSpec Node
  8433. var semicolonTok Token
  8434. switch p.c() {
  8435. case IDENT:
  8436. // ebnf.Sequence VarSpec ";" ctx [IDENT]
  8437. ix := p.ix
  8438. // *ebnf.Name VarSpec ctx [IDENT]
  8439. if varSpec = p.varSpec(); varSpec == nil {
  8440. p.back(ix)
  8441. goto _5
  8442. }
  8443. // *ebnf.Token ";" ctx []
  8444. if semicolonTok, ok = p.accept(SEMICOLON); !ok {
  8445. p.back(ix)
  8446. goto _5
  8447. }
  8448. next := &VarSpecListNode{
  8449. VarSpec: varSpec,
  8450. SEMICOLON: semicolonTok,
  8451. }
  8452. if last != nil {
  8453. last.List = next
  8454. }
  8455. if list == nil {
  8456. list = next
  8457. }
  8458. last = next
  8459. goto _4
  8460. }
  8461. _5:
  8462. }
  8463. // *ebnf.Token ")" ctx []
  8464. if rparenTok, ok = p.accept(RPAREN); !ok {
  8465. p.back(ix)
  8466. goto _2
  8467. }
  8468. }
  8469. break
  8470. _2:
  8471. lparenTok = Token{}
  8472. rparenTok = Token{}
  8473. p.back(ix)
  8474. return nil
  8475. default:
  8476. p.back(ix)
  8477. return nil
  8478. }
  8479. }
  8480. if list != nil && list.List == nil && !list.SEMICOLON.IsValid() {
  8481. return &VarDeclNode{
  8482. VAR: varTok,
  8483. LPAREN: lparenTok,
  8484. VarSpec: list.VarSpec,
  8485. RPAREN: rparenTok,
  8486. }
  8487. }
  8488. return &VarDeclNode{
  8489. VAR: varTok,
  8490. LPAREN: lparenTok,
  8491. VarSpec: list,
  8492. RPAREN: rparenTok,
  8493. }
  8494. }
  8495. // VarSpecNode represents the production
  8496. //
  8497. // VarSpec = identifier ( Type [ "=" ExpressionList ] | "=" ExpressionList ) .
  8498. type VarSpecNode struct {
  8499. IDENT Token
  8500. TypeNode Type
  8501. ASSIGN Token
  8502. ExpressionList *ExpressionListNode
  8503. lexicalScoper
  8504. visible
  8505. }
  8506. // Source implements Node.
  8507. func (n *VarSpecNode) Source(full bool) string { return nodeSource(n, full) }
  8508. // Position implements Node.
  8509. func (n *VarSpecNode) Position() (r token.Position) {
  8510. if n == nil {
  8511. return r
  8512. }
  8513. return n.IDENT.Position()
  8514. }
  8515. // VarSpec2Node represents the production
  8516. //
  8517. // VarSpec = IdentifierList ( Type [ "=" ExpressionList ] | "=" ExpressionList ) .
  8518. type VarSpec2Node struct {
  8519. IdentifierList *IdentifierListNode
  8520. TypeNode Type
  8521. ASSIGN Token
  8522. ExpressionList *ExpressionListNode
  8523. lexicalScoper
  8524. visible
  8525. }
  8526. // Source implements Node.
  8527. func (n *VarSpec2Node) Source(full bool) string { return nodeSource(n, full) }
  8528. // Position implements Node.
  8529. func (n *VarSpec2Node) Position() (r token.Position) {
  8530. if n == nil {
  8531. return r
  8532. }
  8533. return n.IdentifierList.Position()
  8534. }
  8535. func (p *parser) varSpec() Node {
  8536. var (
  8537. identifierList *IdentifierListNode
  8538. typeNode Type
  8539. assignTok Token
  8540. expressionList *ExpressionListNode
  8541. )
  8542. // ebnf.Sequence IdentifierList ( Type [ "=" ExpressionList ] | "=" ExpressionList ) ctx [IDENT]
  8543. {
  8544. ix := p.ix
  8545. // *ebnf.Name IdentifierList ctx [IDENT]
  8546. if identifierList = p.identifierList(); identifierList == nil {
  8547. p.back(ix)
  8548. return nil
  8549. }
  8550. // *ebnf.Group ( Type [ "=" ExpressionList ] | "=" ExpressionList ) ctx []
  8551. // ebnf.Alternative Type [ "=" ExpressionList ] | "=" ExpressionList ctx [ARROW, ASSIGN, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT]
  8552. switch p.c() {
  8553. case ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT: // 0
  8554. // ebnf.Sequence Type [ "=" ExpressionList ] ctx [ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT]
  8555. {
  8556. ix := p.ix
  8557. // *ebnf.Name Type ctx [ARROW, CHAN, FUNC, IDENT, INTERFACE, LBRACK, LPAREN, MAP, MUL, STRUCT]
  8558. if typeNode = p.type1(); typeNode == nil {
  8559. p.back(ix)
  8560. goto _0
  8561. }
  8562. // *ebnf.Option [ "=" ExpressionList ] ctx []
  8563. switch p.c() {
  8564. case ASSIGN:
  8565. // ebnf.Sequence "=" ExpressionList ctx [ASSIGN]
  8566. {
  8567. switch p.peek(1) {
  8568. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  8569. default:
  8570. goto _2
  8571. }
  8572. ix := p.ix
  8573. // *ebnf.Token "=" ctx [ASSIGN]
  8574. assignTok = p.expect(ASSIGN)
  8575. // *ebnf.Name ExpressionList ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  8576. if expressionList = p.expressionList(false); expressionList == nil {
  8577. p.back(ix)
  8578. goto _2
  8579. }
  8580. }
  8581. }
  8582. goto _3
  8583. _2:
  8584. assignTok = Token{}
  8585. expressionList = nil
  8586. _3:
  8587. }
  8588. break
  8589. _0:
  8590. assignTok = Token{}
  8591. expressionList = nil
  8592. typeNode = nil
  8593. p.back(ix)
  8594. return nil
  8595. case ASSIGN: // 1
  8596. // ebnf.Sequence "=" ExpressionList ctx [ASSIGN]
  8597. {
  8598. switch p.peek(1) {
  8599. case ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR:
  8600. default:
  8601. goto _4
  8602. }
  8603. ix := p.ix
  8604. // *ebnf.Token "=" ctx [ASSIGN]
  8605. assignTok = p.expect(ASSIGN)
  8606. // *ebnf.Name ExpressionList ctx [ADD, AND, ARROW, CHAN, CHAR, FLOAT, FUNC, IDENT, IMAG, INT, INTERFACE, LBRACK, LPAREN, MAP, MUL, NOT, STRING, STRUCT, SUB, XOR]
  8607. if expressionList = p.expressionList(false); expressionList == nil {
  8608. p.back(ix)
  8609. goto _4
  8610. }
  8611. }
  8612. break
  8613. _4:
  8614. assignTok = Token{}
  8615. expressionList = nil
  8616. p.back(ix)
  8617. return nil
  8618. default:
  8619. p.back(ix)
  8620. return nil
  8621. }
  8622. }
  8623. sc := p.sc
  8624. if identifierList.Len() == 1 {
  8625. r := &VarSpecNode{
  8626. lexicalScoper: newLexicalScoper(sc),
  8627. IDENT: identifierList.IDENT,
  8628. TypeNode: typeNode,
  8629. ASSIGN: assignTok,
  8630. ExpressionList: expressionList,
  8631. }
  8632. visible := int32(p.ix)
  8633. p.declare(sc, r.IDENT, r, visible, false)
  8634. return r
  8635. }
  8636. r := &VarSpec2Node{
  8637. lexicalScoper: newLexicalScoper(sc),
  8638. IdentifierList: identifierList,
  8639. TypeNode: typeNode,
  8640. ASSIGN: assignTok,
  8641. ExpressionList: expressionList,
  8642. }
  8643. visible := int32(p.ix)
  8644. for l := r.IdentifierList; l != nil; l = l.List {
  8645. p.declare(sc, l.IDENT, r, visible, false)
  8646. }
  8647. return r
  8648. }
  8649. const (
  8650. balanceZero = iota
  8651. balanceTuple
  8652. balanceEqual
  8653. balanceExtraRhs
  8654. balanceExtraLhs
  8655. )
  8656. func checkBalance(lhs, rhs int) int {
  8657. switch {
  8658. case lhs == rhs:
  8659. return balanceEqual
  8660. case lhs > 1 && rhs == 1:
  8661. return balanceTuple
  8662. case lhs > rhs:
  8663. return balanceExtraLhs
  8664. case lhs < rhs:
  8665. return balanceExtraRhs
  8666. default:
  8667. panic(todo("", lhs, rhs))
  8668. }
  8669. }