diff --git a/ldtext/LDText.fs b/ldtext/LDText.fs index 08b29fd..3f9880b 100644 --- a/ldtext/LDText.fs +++ b/ldtext/LDText.fs @@ -1,13 +1,20 @@ module LDText module Ast = - type Rung = Step list + type Rung = + | Rung of Step list and Instr = { Op: string; Args: Operand list } + and BranchArm = + | BranchArm of Step list + + and Branch = + | Branch of BranchArm list + and Step = | StepInstr of Instr - | StepBranch of Step list + | StepBranch of Branch and Operand = | OperandHole diff --git a/ldtext/Parser.fs b/ldtext/Parser.fs index 99f21c9..d6ba291 100644 --- a/ldtext/Parser.fs +++ b/ldtext/Parser.fs @@ -38,6 +38,8 @@ type nonTerminalId = | NONTERM__startrung | NONTERM_rung | NONTERM_steps + | NONTERM_branch + | NONTERM_branch_arms | NONTERM_instr | NONTERM_operands | NONTERM_operand @@ -78,12 +80,17 @@ let prodIdxToNonTerminal (prodIdx:int) = | 1 -> NONTERM_rung | 2 -> NONTERM_steps | 3 -> NONTERM_steps - | 4 -> NONTERM_instr - | 5 -> NONTERM_operands - | 6 -> NONTERM_operands - | 7 -> NONTERM_operands - | 8 -> NONTERM_operand - | 9 -> NONTERM_operand + | 4 -> NONTERM_steps + | 5 -> NONTERM_branch + | 6 -> NONTERM_branch_arms + | 7 -> NONTERM_branch_arms + | 8 -> NONTERM_branch_arms + | 9 -> NONTERM_instr + | 10 -> NONTERM_operands + | 11 -> NONTERM_operands + | 12 -> NONTERM_operands + | 13 -> NONTERM_operand + | 14 -> NONTERM_operand | _ -> failwith "prodIdxToNonTerminal: bad production index" let _fsyacc_endOfInputTag = 11 @@ -114,38 +121,38 @@ let _fsyacc_dataOfToken (t:token) = | RIGHT_PAREN -> (null : System.Object) | LEFT_PAREN -> (null : System.Object) | IDENTIFIER _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x -let _fsyacc_gotos = [| 0us;65535us;1us;65535us;0us;1us;2us;65535us;0us;2us;5us;6us;2us;65535us;0us;5us;5us;5us;2us;65535us;8us;9us;12us;13us;2us;65535us;8us;11us;12us;11us;|] -let _fsyacc_sparseGotoTableRowOffsets = [|0us;1us;3us;6us;9us;12us;|] -let _fsyacc_stateToProdIdxsTableElements = [| 1us;0us;1us;0us;1us;1us;1us;1us;1us;1us;1us;3us;1us;3us;1us;4us;1us;4us;1us;4us;1us;4us;2us;6us;7us;1us;6us;1us;6us;1us;8us;1us;9us;|] -let _fsyacc_stateToProdIdxsTableRowOffsets = [|0us;2us;4us;6us;8us;10us;12us;14us;16us;18us;20us;22us;25us;27us;29us;31us;|] -let _fsyacc_action_rows = 16 -let _fsyacc_actionTableElements = [|1us;16386us;8us;7us;0us;49152us;1us;32768us;2us;3us;1us;32768us;0us;4us;0us;16385us;1us;16386us;8us;7us;0us;16387us;1us;32768us;7us;8us;2us;16389us;1us;15us;8us;14us;1us;32768us;6us;10us;0us;16388us;1us;16391us;3us;12us;2us;16389us;1us;15us;8us;14us;0us;16390us;0us;16392us;0us;16393us;|] -let _fsyacc_actionTableRowOffsets = [|0us;2us;3us;5us;7us;8us;10us;11us;13us;16us;18us;19us;21us;24us;25us;26us;|] -let _fsyacc_reductionSymbolCounts = [|1us;3us;0us;2us;4us;0us;3us;1us;1us;1us;|] -let _fsyacc_productionToNonTerminalTable = [|0us;1us;2us;2us;3us;4us;4us;4us;5us;5us;|] -let _fsyacc_immediateActions = [|65535us;49152us;65535us;65535us;16385us;65535us;16387us;65535us;65535us;65535us;16388us;65535us;65535us;16390us;16392us;16393us;|] +let _fsyacc_gotos = [| 0us;65535us;1us;65535us;0us;1us;5us;65535us;0us;2us;5us;6us;7us;8us;9us;12us;13us;12us;5us;65535us;0us;7us;5us;7us;7us;7us;9us;7us;13us;7us;2us;65535us;9us;10us;13us;14us;5us;65535us;0us;5us;5us;5us;7us;5us;9us;5us;13us;5us;2us;65535us;16us;17us;20us;21us;2us;65535us;16us;19us;20us;19us;|] +let _fsyacc_sparseGotoTableRowOffsets = [|0us;1us;3us;9us;15us;18us;24us;27us;|] +let _fsyacc_stateToProdIdxsTableElements = [| 1us;0us;1us;0us;1us;1us;1us;1us;1us;1us;1us;3us;1us;3us;1us;4us;1us;4us;1us;5us;1us;5us;1us;5us;2us;7us;8us;1us;7us;1us;7us;1us;9us;1us;9us;1us;9us;1us;9us;2us;11us;12us;1us;11us;1us;11us;1us;13us;1us;14us;|] +let _fsyacc_stateToProdIdxsTableRowOffsets = [|0us;2us;4us;6us;8us;10us;12us;14us;16us;18us;20us;22us;24us;27us;29us;31us;33us;35us;37us;39us;42us;44us;46us;48us;|] +let _fsyacc_action_rows = 24 +let _fsyacc_actionTableElements = [|2us;16386us;5us;9us;8us;15us;0us;49152us;1us;32768us;2us;3us;1us;32768us;0us;4us;0us;16385us;2us;16386us;5us;9us;8us;15us;0us;16387us;2us;16386us;5us;9us;8us;15us;0us;16388us;2us;16386us;5us;9us;8us;15us;1us;32768us;4us;11us;0us;16389us;1us;16392us;3us;13us;2us;16386us;5us;9us;8us;15us;0us;16391us;1us;32768us;7us;16us;2us;16394us;1us;23us;8us;22us;1us;32768us;6us;18us;0us;16393us;1us;16396us;3us;20us;2us;16394us;1us;23us;8us;22us;0us;16395us;0us;16397us;0us;16398us;|] +let _fsyacc_actionTableRowOffsets = [|0us;3us;4us;6us;8us;9us;12us;13us;16us;17us;20us;22us;23us;25us;28us;29us;31us;34us;36us;37us;39us;42us;43us;44us;|] +let _fsyacc_reductionSymbolCounts = [|1us;3us;0us;2us;2us;3us;0us;3us;1us;4us;0us;3us;1us;1us;1us;|] +let _fsyacc_productionToNonTerminalTable = [|0us;1us;2us;2us;2us;3us;4us;4us;4us;5us;6us;6us;6us;7us;7us;|] +let _fsyacc_immediateActions = [|65535us;49152us;65535us;65535us;16385us;65535us;16387us;65535us;16388us;65535us;65535us;16389us;65535us;65535us;16391us;65535us;65535us;65535us;16393us;65535us;65535us;16395us;16397us;16398us;|] let _fsyacc_reductions = lazy [| -# 128 "Parser.fs" +# 135 "Parser.fs" (fun (parseState : FSharp.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> Instr list in + let _1 = parseState.GetInput(1) :?> Rung in Microsoft.FSharp.Core.Operators.box ( ( raise (FSharp.Text.Parsing.Accept(Microsoft.FSharp.Core.Operators.box _1)) ) : 'gentype__startrung)); -# 137 "Parser.fs" +# 144 "Parser.fs" (fun (parseState : FSharp.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_steps in Microsoft.FSharp.Core.Operators.box ( ( # 26 "Parser.fsy" - _1 + Rung _1 ) # 26 "Parser.fsy" - : Instr list)); -# 148 "Parser.fs" + : Rung)); +# 155 "Parser.fs" (fun (parseState : FSharp.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( @@ -155,7 +162,7 @@ let _fsyacc_reductions = lazy [| ) # 29 "Parser.fsy" : 'gentype_steps)); -# 158 "Parser.fs" +# 165 "Parser.fs" (fun (parseState : FSharp.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_instr in let _2 = parseState.GetInput(2) :?> 'gentype_steps in @@ -163,78 +170,134 @@ let _fsyacc_reductions = lazy [| ( ( # 30 "Parser.fsy" - _1 :: _2 + StepInstr _1 :: _2 ) # 30 "Parser.fsy" : 'gentype_steps)); -# 170 "Parser.fs" +# 177 "Parser.fs" (fun (parseState : FSharp.Text.Parsing.IParseState) -> - let _1 = parseState.GetInput(1) :?> string in - let _3 = parseState.GetInput(3) :?> 'gentype_operands in + let _1 = parseState.GetInput(1) :?> 'gentype_branch in + let _2 = parseState.GetInput(2) :?> 'gentype_steps in Microsoft.FSharp.Core.Operators.box ( ( -# 33 "Parser.fsy" - { Op = _1; Args = _3 } +# 31 "Parser.fsy" + StepBranch _1 :: _2 ) -# 33 "Parser.fsy" - : 'gentype_instr)); -# 182 "Parser.fs" +# 31 "Parser.fsy" + : 'gentype_steps)); +# 189 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _2 = parseState.GetInput(2) :?> 'gentype_branch_arms in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 34 "Parser.fsy" + Branch _2 + ) +# 34 "Parser.fsy" + : 'gentype_branch)); +# 200 "Parser.fs" (fun (parseState : FSharp.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -# 36 "Parser.fsy" +# 37 "Parser.fsy" [] ) -# 36 "Parser.fsy" +# 37 "Parser.fsy" + : 'gentype_branch_arms)); +# 210 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> 'gentype_steps in + let _3 = parseState.GetInput(3) :?> 'gentype_branch_arms in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 38 "Parser.fsy" + BranchArm _1 :: _3 + ) +# 38 "Parser.fsy" + : 'gentype_branch_arms)); +# 222 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> 'gentype_steps in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 39 "Parser.fsy" + [ BranchArm _1 ] + ) +# 39 "Parser.fsy" + : 'gentype_branch_arms)); +# 233 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + let _1 = parseState.GetInput(1) :?> string in + let _3 = parseState.GetInput(3) :?> 'gentype_operands in + Microsoft.FSharp.Core.Operators.box + ( + ( +# 42 "Parser.fsy" + { Op = _1; Args = _3 } + ) +# 42 "Parser.fsy" + : 'gentype_instr)); +# 245 "Parser.fs" + (fun (parseState : FSharp.Text.Parsing.IParseState) -> + Microsoft.FSharp.Core.Operators.box + ( + ( +# 45 "Parser.fsy" + [] + ) +# 45 "Parser.fsy" : 'gentype_operands)); -# 192 "Parser.fs" +# 255 "Parser.fs" (fun (parseState : FSharp.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_operand in let _3 = parseState.GetInput(3) :?> 'gentype_operands in Microsoft.FSharp.Core.Operators.box ( ( -# 37 "Parser.fsy" +# 46 "Parser.fsy" _1 :: _3 ) -# 37 "Parser.fsy" +# 46 "Parser.fsy" : 'gentype_operands)); -# 204 "Parser.fs" +# 267 "Parser.fs" (fun (parseState : FSharp.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> 'gentype_operand in Microsoft.FSharp.Core.Operators.box ( ( -# 38 "Parser.fsy" +# 47 "Parser.fsy" [ _1 ] ) -# 38 "Parser.fsy" +# 47 "Parser.fsy" : 'gentype_operands)); -# 215 "Parser.fs" +# 278 "Parser.fs" (fun (parseState : FSharp.Text.Parsing.IParseState) -> let _1 = parseState.GetInput(1) :?> string in Microsoft.FSharp.Core.Operators.box ( ( -# 41 "Parser.fsy" +# 50 "Parser.fsy" OperandTag _1 ) -# 41 "Parser.fsy" +# 50 "Parser.fsy" : 'gentype_operand)); -# 226 "Parser.fs" +# 289 "Parser.fs" (fun (parseState : FSharp.Text.Parsing.IParseState) -> Microsoft.FSharp.Core.Operators.box ( ( -# 42 "Parser.fsy" +# 51 "Parser.fsy" OperandHole ) -# 42 "Parser.fsy" +# 51 "Parser.fsy" : 'gentype_operand)); |] -# 237 "Parser.fs" +# 300 "Parser.fs" let tables : FSharp.Text.Parsing.Tables<_> = { reductions = _fsyacc_reductions.Value; endOfInputTag = _fsyacc_endOfInputTag; @@ -256,5 +319,5 @@ let tables : FSharp.Text.Parsing.Tables<_> = numTerminals = 12; productionToNonTerminalTable = _fsyacc_productionToNonTerminalTable } let engine lexer lexbuf startState = tables.Interpret(lexer, lexbuf, startState) -let rung lexer lexbuf : Instr list = +let rung lexer lexbuf : Rung = engine lexer lexbuf 0 :?> _ diff --git a/ldtext/Parser.fsi b/ldtext/Parser.fsi index 19a1d95..334e3ce 100644 --- a/ldtext/Parser.fsi +++ b/ldtext/Parser.fsi @@ -26,6 +26,8 @@ type nonTerminalId = | NONTERM__startrung | NONTERM_rung | NONTERM_steps + | NONTERM_branch + | NONTERM_branch_arms | NONTERM_instr | NONTERM_operands | NONTERM_operand @@ -40,4 +42,4 @@ val prodIdxToNonTerminal: int -> nonTerminalId /// This function gets the name of a token as a string val token_to_string: token -> string -val rung : (FSharp.Text.Lexing.LexBuffer<'cty> -> token) -> FSharp.Text.Lexing.LexBuffer<'cty> -> (Instr list) +val rung : (FSharp.Text.Lexing.LexBuffer<'cty> -> token) -> FSharp.Text.Lexing.LexBuffer<'cty> -> (Rung) diff --git a/ldtext/Parser.fsy b/ldtext/Parser.fsy index 971bad6..e2a50d3 100644 --- a/ldtext/Parser.fsy +++ b/ldtext/Parser.fsy @@ -18,16 +18,25 @@ open FSharp.Text.Lexing %start rung // return type of parser, marked by start token -%type rung +%type rung %% rung: - | steps SEMICOLON EOF { $1 } + | steps SEMICOLON EOF { Rung $1 } steps: | { [] } - | instr steps { $1 :: $2 } + | instr steps { StepInstr $1 :: $2 } + | branch steps { StepBranch $1 :: $2 } + +branch: + | LEFT_BRACKET branch_arms RIGHT_BRACKET { Branch $2 } + +branch_arms: + | { [] } + | steps COMMA branch_arms { BranchArm $1 :: $3} + | steps { [ BranchArm $1 ] } instr: | IDENTIFIER LEFT_PAREN operands RIGHT_PAREN { { Op = $1; Args = $3 } } diff --git a/ldtext/test.fsx b/ldtext/test.fsx index d06074c..bfc7f19 100644 --- a/ldtext/test.fsx +++ b/ldtext/test.fsx @@ -22,5 +22,6 @@ parse "abc();" parse "abc(def);" parse "abc(def,ghi);" parse "abc(def,ghi) a(b) ;" +parse "a() [ b() c(), d(), , e() [ f() ] g() ] h();" if failed then exit 1 else exit 0 \ No newline at end of file