package Ġorg . jetbrains . cab al . parser Ċ Ċ import Ġcom . intellij . psi . tree . I ElementType Ċ import Ġcom . intellij . psi . TokenType Ċ import Ġcom . intellij . lang . Psi Builder Ċ import Ġcom . intellij . lang . Psi Builder . Marker Ċ import Ġcom . intellij . lang . AST Node Ċ import Ġorg . jetbrains . cab al . parser .* Ċ import Ġorg . jetbrains . haskell . parser . rules . Base Parser Ċ import Ġorg . jetbrains . haskell . parser . H askell TokenType Ċ Ċ class ĠCab al Parser ( root : ĠI ElementType , Ġbuilder : ĠPsi Builder ) Ġ: ĠBase Parser ( root , Ġbuilder ) Ġ{ ĊĊĠĠĠ Ġfun Ġparse (): ĠAST Node Ġ= Ġparse Internal ( root ) ĊĊĠĠĠ Ġfun Ġcan Parse ( parse : Ġ() Ġ-> ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmarker Ġ= Ġbuilder . mark () ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġparse () ĊĠĠĠĠĠĠĠ Ġmarker . rollback To () ĊĠĠĠĠĠĠĠ Ġreturn Ġres ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġindent Size ( str : ĠString ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠindexOf Ġ= Ġstr . lastIndexOf ('\ n ') ĊĠĠĠĠĠĠĠ Ġreturn Ġstr . length Ġ- ĠindexOf Ġ- Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnext Level () Ġ: ĠInt ? Ġ{ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// there Ġcan Ġnever Ġbe Ġtwo ĠNEW _ LINE _ IND ENT 's Ġnext Ġto Ġeach Ġother ĊĠĠĠĠĠĠĠ Ġif Ġ((! builder . eof ()) Ġ&& Ġ( builder . token Type Ġ== ĠTokenType . NEW _ LINE _ IND ENT )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġindent Size ( builder . token Text !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Last On This Line () Ġ: ĠBoolean Ġ= Ġbuilder . eof () Ġ|| Ġ( builder . token Type Ġ== ĠTokenType . NEW _ LINE _ IND ENT ) ĊĊĠĠĠ Ġfun Ġskip NewLine Big ger Level ( prev Level : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnext Indent Ġ= Ġnext Level () ĊĠĠĠĠĠĠĠ Ġif Ġ(( next Indent Ġ!= Ġnull ) Ġ&& Ġ( next Indent Ġ> Ġprev Level )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . advance Lexer () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Last Big ger Level ( level : ĠInt ) Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnext Indent Ġ= Ġnext Level () ĊĠĠĠĠĠĠĠ Ġif Ġ( builder . eof () Ġ|| Ġ(( next Indent Ġ!= Ġnull ) Ġ&& Ġ( next Indent Ġ<= Ġlevel ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġskip All Big ger Level T ill ( level : ĠInt , Ġparse Separator : Ġ() Ġ-> ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! builder . eof ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Last Big ger Level ( level )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( can Parse ({ Ġskip NewLine Big ger Level ( level ); Ġparse Separator () Ġ})) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . advance Lexer () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġskip Free Line T ill ( parse Separator : Ġ() Ġ-> ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! is Last On This Line () Ġ&& Ġ! can Parse ( parse Separator )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . advance Lexer () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse Property Key ( prop Name Ġ: ĠString ?) Ġ= Ġstart ( Cab al To kel Types . PROPERTY _ KEY ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( prop Name Ġ== Ġnull ) Ġtoken ( Cab al To kel Types . ID ) Ġelse Ġmatches IgnoreCase ( Cab al To kel Types . ID , Ġprop Name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse Bool () Ġ= Ġmatches IgnoreCase ( Cab al To kel Types . ID , Ġ" true ") Ġ|| Ġmatches IgnoreCase ( Cab al To kel Types . ID , Ġ" false ") ĊĊĠĠĠ Ġfun Ġparse Version () Ġ= Ġtoken ( Cab al To kel Types . NUMBER ) Ġ|| Ġtoken ( Cab al To kel Types . ID ) ĊĊĠĠĠ Ġfun Ġparse Simple Version Constraint () Ġ= Ġstart ( Cab al To kel Types . VERSION _ CONSTRAINT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( token ( Cab al To kel Types . COMP AR ATOR )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparse Version () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmatches ( Cab al To kel Types . ID , Ġ"- any ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse Free Line ( elem Type : ĠI ElementType ) Ġ= Ġstart ( elem Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar ĠisEmpty Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! is Last On This Line ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . advance Lexer () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠisEmpty Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ! isEmpty ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse Invalid Line () Ġ= Ġparse Free Line ( Cab al To kel Types . INVALID _ VALUE ) Ġ|| Ġstart ( Cab al To kel Types . INVALID _ VALUE , Ġ{ Ġtrue Ġ}) ĊĊĠĠĠ Ġfun Ġparse As Invalid ( parse Body : Ġ() Ġ-> ĠBoolean ) Ġ= Ġstart ( Cab al To kel Types . INVALID _ VALUE , Ġ{ Ġparse Body () Ġ}) ĊĊĠĠĠ Ġfun Ġparse Free Form ( prev Level : ĠInt ) Ġ= Ġstart ( Cab al To kel Types . FREE _ FORM ) Ġ{ ĊĠĠĠĠĠĠĠ Ġskip All Big ger Level T ill ( prev Level , Ġparse Separator Ġ= Ġ{ Ġfalse Ġ}); Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse Invalid T ill Separator ( prev Level : ĠInt , Ġparse Separator : Ġ() Ġ-> ĠBoolean , Ġon One Line : ĠBoolean ) Ġ= Ġstart ( Cab al To kel Types . INVALID _ VALUE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! on One Line ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġskip All Big ger Level T ill ( prev Level , Ġparse Separator ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġskip Free Line T ill ( parse Separator ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse Id Value ( elem Type : ĠI ElementType ) Ġ= Ġstart ( elem Type , Ġ{ Ġtoken ( Cab al To kel Types . ID ) Ġ}) ĊĊĠĠĠ Ġfun Ġparse Token Value ( elem Type : ĠI ElementType ) Ġ= Ġstart ( elem Type ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġnext Token IsValid () Ġ= Ġ! is Last On This Line () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ( builder . token Type Ġ!= ĠCab al To kel Types . COMMA ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ( builder . token Type Ġ!= ĠCab al To kel Types . TAB ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġempty Space Before Next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ(( builder . raw Lookup (- 1 ) Ġ== ĠTokenType . WHITE _ SPACE ) Ġ|| Ġ( builder . raw Lookup (- 1 ) Ġ== ĠCab al To kel Types . COMMENT )) ĊĊĠĠĠĠĠĠĠ Ġvar ĠisEmpty Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġwhile Ġ( nextToken IsValid ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . advance Lexer () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠisEmpty Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Last On This Line () Ġ&& Ġempty Space Before Next ()) Ġbreak ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ! isEmpty ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse Path () Ġ= Ġparse Token Value ( Cab al To kel Types . PATH ) ĊĊĠĠĠ Ġfun Ġparse Version Value () Ġ= Ġstart ( Cab al To kel Types . VERSION _ VALUE , Ġ{ Ġparse Version () Ġ}) ĊĊĠĠĠ Ġfun Ġparse T ill Separator Or Prev Level ( prev Level : ĠInt , Ġparse Value Ġ: Ġ() Ġ-> ĠBoolean , Ġparse Separator Ġ: Ġ() Ġ-> ĠBoolean , Ġon One Line : ĠBoolean , Ġseparator Is Optional : ĠBoolean ) Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! on One Line ) Ġskip NewLine Big ger Level ( prev Level ) ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreturns Ġfalse Ġif Ġthere Ġis Ġnothing Ġto Ġparse ĊĠĠĠĠĠĠĠ Ġval Ġmark Ġ= Ġbuilder . mark () ĊĠĠĠĠĠĠĠ Ġvar Ġvalue Parsed Ġ= Ġparse Value () ĊĠĠĠĠĠĠĠ Ġif Ġ(! on One Line ) Ġskip NewLine Big ger Level ( prev Level ) ĊĠĠĠĠĠĠĠ Ġif Ġ( value Parsed Ġ&& Ġ( is Last Big ger Level ( prev Level ) Ġ|| Ġcan Parse ({ Ġparse Separator () Ġ}) Ġ|| Ġseparator Is Optional )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmark . drop () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmark . rollback To () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparse Invalid T ill Separator ( prev Level , Ġparse Separator , Ġon One Line ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! on One Line ) Ġskip NewLine Big ger Level ( prev Level ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse T ill End Value List ( prev Level : ĠInt , Ġparse Value Ġ: Ġ() Ġ-> ĠBoolean , Ġparse Separator Ġ: Ġ() Ġ-> ĠBoolean , Ġseparator Is Optional : ĠBoolean , Ġon One Line : ĠBoolean ) Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparse T ill Separator Or Prev Level ( prev Level , Ġparse Value , Ġparse Separator , Ġon One Line , Ġseparator Is Optional ) ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ((! builder . eof ()) Ġ&& Ġ! is Last Big ger Level ( prev Level ) Ġ&& Ġ( parse Separator () Ġ|| Ġseparator Is Optional )) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse T ill Valid Value List ( prev Level : ĠInt , Ġparse Value Ġ: Ġ() Ġ-> ĠBoolean , Ġparse Separator Ġ: Ġ() Ġ-> ĠBoolean , Ġon One Line : ĠBoolean ) Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmark : ĠMarker ? Ġ= Ġbuilder . mark () ĊĠĠĠĠĠĠĠ Ġvar Ġnon Empty Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! on One Line ) Ġskip NewLine Big ger Level ( prev Level ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parse Value ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmark ?. drop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnon Empty Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmark Ġ= Ġbuilder . mark () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! on One Line ) Ġskip NewLine Big ger Level ( prev Level ) ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ((! builder . eof ()) Ġ&& Ġparse Separator ()) ĊĠĠĠĠĠĠĠ Ġmark ?. rollback To () ĊĠĠĠĠĠĠĠ Ġreturn Ġnon Empty ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse Common Comma List ( prev Level : ĠInt , Ġparse Body : Ġ() Ġ-> ĠBoolean ) Ġ= Ġparse T ill End Value List ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprev Level , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparse Body , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġtoken ( Cab al To kel Types . COMMA ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġseparator Is Optional Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon One Line Ġ= Ġfalse ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġfun Ġparse Token List ( prev Level : ĠInt ) Ġ Ġ= Ġparse Common Comma List ( prev Level , Ġ{ Ġparse Token Value ( Cab al To kel Types . TOKEN ) Ġ}) ĊĊĠĠĠ Ġfun Ġparse IdList ( prev Level : ĠInt ) Ġ= Ġparse Common Comma List ( prev Level , Ġ{ Ġparse Id Value ( Cab al To kel Types . IDENTIFIER ) Ġ}) ĊĊĠĠĠ Ġfun Ġparse Option List ( prev Level : ĠInt ) Ġ= Ġparse Common Comma List ( prev Level , Ġ{ Ġparse Token Value ( Cab al To kel Types . OPTION ) Ġ}) ĊĊĠĠĠ Ġfun Ġparse Path List ( prev Level : ĠInt ) ĠĠ Ġ= Ġparse Common Comma List ( prev Level , Ġ{ Ġparse Path () Ġ}) ĊĊĠĠĠ Ġfun Ġparse Language List ( prev Level : ĠInt ) Ġ= Ġparse Common Comma List ( prev Level , Ġ{ Ġparse Id Value ( Cab al To kel Types . LANGUAGE ) Ġ}) ĊĊĠĠĠ Ġfun Ġparse Complex Version Constraint ( prev Level Ġ: ĠInt , Ġon One Line : ĠBoolean Ġ= Ġfalse ) Ġ= Ġstart ( Cab al To kel Types . COMPLEX _ CONSTRAINT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġparse T ill Valid Value List ( prev Level , Ġ{ Ġparse Simple Version Constraint () Ġ}, Ġ{ Ġtoken ( Cab al To kel Types . LOGIC ) Ġ}, Ġon One Line ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse Full Version Constraint ( prev Level : ĠInt , Ġtoken Type : ĠI ElementType , Ġon One Line : ĠBoolean Ġ= Ġfalse ) Ġ= Ġstart ( Cab al To kel Types . FULL _ CONSTRAINT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġparse Id Value ( token Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ( parse Complex Version Constraint ( prev Level , Ġon One Line ) Ġ|| Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse Simple Condition ( prev Level : ĠInt ) Ġ= Ġstart ( Cab al To kel Types . SIMPLE _ CONDITION ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtest Name Ġ= Ġbuilder . token Text ĊĠĠĠĠĠĠĠ Ġif Ġ( parse Bool ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( token ( Cab al To kel Types . ID ) Ġ&& Ġtoken ( Cab al To kel Types . OPEN _ PAREN )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġres : ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( test Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" impl " Ġ-> Ġres Ġ= Ġparse Full Version Constraint ( prev Level , ĠCab al To kel Types . COMPILER , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" flag " Ġ-> Ġres Ġ= Ġparse Id Value ( Cab al To kel Types . NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠ Ġ-> Ġres Ġ= Ġparse Id Value ( Cab al To kel Types . IDENTIFIER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġres Ġ&& Ġtoken ( Cab al To kel Types . CLOSE _ PAREN ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse Invalid Condition Part () Ġ= Ġstart ( Cab al To kel Types . INVALID _ CONDITION _ PART ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! builder . eof () Ġ&& Ġ( builder . token Type Ġ!= ĠCab al To kel Types . LOGIC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ( builder . token Type Ġ!= ĠCab al To kel Types . CLOSE _ PAREN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ( builder . token Type Ġ!= ĠTokenType . NEW _ LINE _ IND ENT )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( builder . token Text Ġ== Ġ" flag ") Ġ&& Ġtoken ( Cab al To kel Types . ID ) Ġ&& Ġtoken ( Cab al To kel Types . OPEN _ PAREN )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse Id Value ( Cab al To kel Types . NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġbuilder . advance Lexer () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse Condition Part ( prev Level : ĠInt ): ĠBoolean Ġ= Ġstart ( Cab al To kel Types . CONDITION _ PART ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( token ( Cab al To kel Types . NEG ATION )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparse Condition Part ( prev Level ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( token ( Cab al To kel Types . OPEN _ PAREN )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparse Condition ( prev Level ) Ġ&& Ġ( token ( Cab al To kel Types . CLOSE _ PAREN ) Ġ|| Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparse Simple Condition ( prev Level ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse Condition ( prev Level : ĠInt ) Ġ= Ġparse T ill Valid Value List ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprev Level , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġparse Condition Part ( prev Level ) Ġ|| Ġparse Invalid Condition Part () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġtoken ( Cab al To kel Types . LOGIC ) Ġ|| Ġ( parse Invalid Condition Part () Ġ&& Ġtoken ( Cab al To kel Types . LOGIC )) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon One Line Ġ= Ġtrue ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġfun Ġparse Full Condition ( level : ĠInt ) Ġ= Ġstart ( Cab al To kel Types . FULL _ CONDITION , Ġ{ Ġparse Condition ( level ) Ġ}) ĊĊĠĠĠ Ġfun Ġparse Constraint List ( prev Level : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Type : ĠI ElementType Ġ= ĠCab al To kel Types . IDENTIFIER , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseparator Is Optional : ĠBoolean Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġparse T ill End Value List ( prev Level , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġparse Full Version Constraint ( prev Level , Ġtoken Type ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġtoken ( Cab al To kel Types . COMMA ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseparator Is Optional , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon One Line Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġfun Ġparse Compiler List ( prev Level : ĠInt ) Ġ= Ġparse Constraint List ( prev Level , ĠCab al To kel Types . COMPILER , Ġtrue ) ĊĊĠĠĠ Ġfun Ġparse Field ( level : ĠInt , Ġkey Ġ: ĠString ?, Ġelem Type : ĠI ElementType , Ġparse Value Ġ: ĠCab al Parser .( Int ) Ġ-> ĠBoolean ) Ġ= Ġstart ( elem Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( parse Property Key ( key ) Ġ&& Ġtoken ( Cab al To kel Types . COL ON )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġskip NewLine Big ger Level ( level ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( parse Value ( level ) Ġ&& Ġis Last Big ger Level ( level )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġparse Invalid T ill Separator ( level , Ġparse Separator Ġ= Ġ{ Ġfalse Ġ}, Ġon One Line Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse Invalid Field ( level : ĠInt ) Ġ= Ġstart ( Cab al To kel Types . INVALID _ FIELD ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( parse Id Value ( Cab al To kel Types . NAME )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken ( Cab al To kel Types . COL ON ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġskip All Big ger Level T ill ( level , Ġparse Separator Ġ= Ġ{ Ġfalse Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse Field From ( level : ĠInt , Ġfields : ĠMap < String , ĠPair < I ElementType , ĠCab al Parser .( Int ) Ġ-> ĠBoolean >>) Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( key Ġin Ġfields . keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parse Field ( level , Ġkey , Ġfields . get ( key ) !!. first , Ġfields . get ( key ) !!. second )) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse Properties ( prev Level : ĠInt , Ġparse Fields : ĠCab al Parser .( Int ) Ġ-> ĠBoolean , Ġcan Contain If : ĠBoolean ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġparse Some Field ( level : ĠInt ) Ġ= Ġparse Fields ( level ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġ( can Contain If Ġ&& Ġparse If Else ( level , Ġparse Fields )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġparse Invalid Field ( level ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġparse Invalid Line () ĊĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Level Ġ: ĠInt ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! builder . eof ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlevel Ġ= Ġnext Level () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( level Ġ== Ġnull ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ((( current Level Ġ== Ġnull ) Ġ|| Ġ( level Ġ!= Ġcurrent Level )) Ġ&& Ġ( level Ġ<= Ġprev Level )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// sections Ġwithout Ġany Ġfield Ġis Ġallowed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ(( current Level Ġ== Ġnull ) Ġ&& Ġ( level Ġ> Ġprev Level )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Level Ġ= Ġlevel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġskip NewLine Big ger Level ( prev Level ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( current Level Ġ!= Ġnull ) Ġ&& Ġ( level Ġ!= Ġcurrent Level ) Ġ&& Ġ( level Ġ> Ġprev Level )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse Invalid T ill Separator ( current Level , Ġparse Separator Ġ= Ġ{ Ġfalse Ġ}, Ġon One Line Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse Some Field ( level ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse Section Type ( name : ĠString ) Ġ= Ġstart ( Cab al To kel Types . SECTION _ TYPE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmatches IgnoreCase ( Cab al To kel Types . ID , Ġname ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse Section Name () Ġ= Ġstart ( Cab al To kel Types . NAME ) Ġ{ ĊĠĠĠĠĠĠĠ Ġskip Free Line T ill ({ Ġfalse Ġ}) ĊĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse Repo Kinds () Ġ= Ġ( parse Id Value ( Cab al To kel Types . REPO _ KIND ) Ġ&& Ġparse Id Value ( Cab al To kel Types . REPO _ KIND )) Ġ|| Ġtrue ĊĊĠĠĠ Ġfun Ġparse Exact Section ( level : ĠInt , Ġkey : ĠString , Ġparse After Info : ĠCab al Parser .( Int ) Ġ-> ĠBoolean , Ġparse Body : Ġ( Int ) Ġ-> ĠBoolean ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠ Ġ= Ġstart ( SECTION _ TYPES . get ( key ) !! ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( parse Section Type ( key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( parse After Info ( level ) Ġ&& Ġis Last On This Line ()) Ġ|| Ġparse Invalid Line () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparse Properties ( level , Ġ{ Ġparse Body ( it ) Ġ}, Ġcan Contain If Ġ= Ġ( key Ġin ĠBUILD _ INFO _ SECTION S ) Ġ|| Ġ( key Ġin ĠIF _ ELSE )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse Top Section ( level : ĠInt , Ġkey : ĠString ) Ġ= Ġparse Exact Section ( level , Ġkey , ĠSECTION S . get ( key ) !!. first ) Ġ{ ĊĠĠĠĠĠĠĠ Ġparse Field From ( it , ĠSECTION S . get ( key ) !!. second !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse If OrElse ( level : ĠInt , Ġkey : ĠString , Ġparse Fields : ĠCab al Parser .( Int ) Ġ-> ĠBoolean ) Ġ= Ġparse Exact Section ( level , Ġkey , ĠSECTION S . get ( key ) !!. first ) Ġ{ ĊĠĠĠĠĠĠĠ Ġparse Fields ( it ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse If Else ( level : ĠInt , Ġparse Fields : ĠCab al Parser .( Int ) Ġ-> ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( parse If OrElse ( level , Ġ" if ", Ġparse Fields )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Level () Ġ== Ġlevel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmarker Ġ= Ġbuilder . mark () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskip NewLine Big ger Level ( level Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parse If OrElse ( level , Ġ" else ", Ġparse Fields )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmarker . drop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmarker . rollback To () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse Top Section ( level : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( key Ġin ĠTOP _ SECTION _ NAMES ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parse Top Section ( level , Ġkey )) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse TopLevel Field ( first Indent : ĠInt ) Ġ= Ġparse Field From ( first Indent , ĠPK G _ DESCR _ FIELDS ) ĊĊĠĠĠ Ġfun Ġparse Internal ( root : ĠI ElementType ): ĠAST Node Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġparse Some Field ( level : ĠInt ) Ġ= Ġparse TopLevel Field ( level ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġparse Top Section ( level ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġparse Invalid Field ( level ) ĊĊĠĠĠĠĠĠĠ Ġval Ġroot Marker Ġ= Ġmark () ĊĠĠĠĠĠĠĠ Ġval Ġfirst Indent Ġ= Ġnext Level () Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! builder . eof ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Indent Ġ= Ġnext Level () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( next Indent Ġ== Ġnull ) Ġ|| Ġ( next Indent Ġ== Ġfirst Indent )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskip NewLine Big ger Level ( first Indent Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! builder . eof ()) Ġ( parse Some Field ( first Indent ) Ġ|| Ġparse Invalid Line ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskip NewLine Big ger Level (- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! builder . eof ()) Ġparse Invalid Line () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġroot Marker . done ( root ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder . tree Built ĊĠĠĠ Ġ} Ċ }