module IBAF-Start imports Funcons // Language "IBAFlang" lexical syntax // Language // #1 Arithmetic expressions LEX-DASH = "-" LEX-decimal = ( [0-9] )+ LEX-id = ( [A-Z] | [a-z] )+ syntax // Language // #1 Arithmetic expressions context-free syntax // Language L-start.L-start--L-aexp = L-aexp // #1 Arithmetic expressions L-aexp.L-aexp--L-num = L-num L-aexp.L-aexp--L-id = L-id L-aexp.L-aexp--L-aexp-PLUS-L-aexp = L-aexp "+" L-aexp L-aexp.L-aexp--L-aexp-SLASH-L-aexp = L-aexp "/" L-aexp L-aexp.L-aexp--LPAREN-L-aexp-RPAREN = "(" L-aexp ")" L-decimal.LEX-decimal = LEX-decimal L-id.LEX-id = LEX-id context-free syntax // Semantics FCT.T-start = "start" "[:" L-start ":]" // #1 Arithmetic expressions FCT.T-eval-arith = "eval-arith" "[:" L-aexp ":]" FCT-Quoted.L-decimal = L-decimal FCT.T-int-val = "int-val" "[:" L-num ":]" FCT-Quoted.L-id = L-id FCT.T-id = "id" "[:" L-id ":]" context-free syntax // Desugaring // #1 Arithmetic expressions variables // Meta-variables L-start = "(:START" [1-9]? ":)" {prefer} L-start? = "(:START" [1-9]? "?:)" {prefer} L-start* = "(:START" [1-9]? "*:)" {prefer} L-start+ = "(:START" [1-9]? "+:)" {prefer} // #1 Arithmetic expressions L-aexp = "(:AExp" [1-9]? ":)" {prefer} L-aexp? = "(:AExp" [1-9]? "?:)" {prefer} L-aexp* = "(:AExp" [1-9]? "*:)" {prefer} L-aexp+ = "(:AExp" [1-9]? "+:)" {prefer} L-num = "(:N" [1-9]? ":)" {prefer} L-num? = "(:N" [1-9]? "?:)" {prefer} L-num* = "(:N" [1-9]? "*:)" {prefer} L-num+ = "(:N" [1-9]? "+:)" {prefer} L-decimal = "(:D" [1-9]? ":)" {prefer} L-decimal? = "(:D" [1-9]? "?:)" {prefer} L-decimal* = "(:D" [1-9]? "*:)" {prefer} L-decimal+ = "(:D" [1-9]? "+:)" {prefer} L-id = "(:I" [1-9]? ":)" {prefer} L-id? = "(:I" [1-9]? "?:)" {prefer} L-id* = "(:I" [1-9]? "*:)" {prefer} L-id+ = "(:I" [1-9]? "+:)" {prefer} // SDF comments // #1 Arithmetic expressions sorts // ASTs T-start