forked from glen/fostr
Glen Whitney
804a00902a
Caveat: type is still not being assigned for the Sequence() constructor. Also fixes the parsing of literal strings (whitespace just after the opening quote was being ignored, and was ambiguous just before the opening quote).
57 lines
1.0 KiB
Plaintext
57 lines
1.0 KiB
Plaintext
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>;>
|
|
|
|
Ex.Int = INT
|
|
Ex.LitString = STRING_LITERAL
|
|
Ex.Stream = <stream>
|
|
Ex.Sum = <<Ex> + <Ex>> {left}
|
|
Ex.Gets = [[Ex] << [Ex]] {left}
|
|
Ex.To = [[Ex] >> [Ex]] {left}
|
|
|
|
Ex = <(<Ex>)> {bracket}
|
|
|
|
context-free priorities
|
|
|
|
Ex.To
|
|
> Ex.Sum
|
|
> Ex.Gets,
|
|
|
|
// prevent cycle: no singletons
|
|
LineSeq.Sequence <0> .> Line+ = Line
|