module fostr imports Common context-free start-symbols Start lexical sorts STRING_LITERAL lexical syntax STRING_LITERAL = "'"~[\']*"'" context-free sorts Start LineSeq Line OptTermEx TermExLst TermEx Ex context-free syntax Start.TopLevel = LineSeq LineSeq = Line LineSeq.Sequence = sq:Line+ {layout(align-list sq)} Line = OptTermEx Line.ISequence = TermExLst OptTermEx {layout(0.first.line == 1.first.line)} TermExLst.Prior = TermEx+ OptTermEx = ex:Ex {layout(offside ex)} OptTermEx = te:TermEx {layout(offside te)} TermEx.Terminate = <;> Ex.Int = INT Ex.LitString = STRING_LITERAL Ex.EscString = STRING Ex.Stream = Ex.Sum = < + > {left} Ex.Concat = < ++ > {left} Ex.Gets = [[Ex] << [Ex]] {left} Ex.DefGets = [<<< [Ex]] Ex.To = [[Ex] >> [Ex]] {left} Ex.DefTo = [[Ex] >>>] Ex.Emits = <!> Ex.DefEmits = Ex = <()> {bracket} context-free priorities Ex.To > Ex.DefTo > {Ex.Sum Ex.Concat} > Ex.DefGets > Ex.Gets, // prevent cycle: no singletons LineSeq.Sequence <0> .> Line+ = Line