Make list productions left-recursive

This commit is contained in:
2025-09-08 15:19:49 -06:00
parent 46f2bbcc9b
commit 70d7d80ce0
4 changed files with 138 additions and 87 deletions

View File

@@ -38,10 +38,13 @@ type nonTerminalId =
| NONTERM__startrung | NONTERM__startrung
| NONTERM_rung | NONTERM_rung
| NONTERM_steps | NONTERM_steps
| NONTERM_steps_reversed
| NONTERM_branch | NONTERM_branch
| NONTERM_branch_arms | NONTERM_branch_arms
| NONTERM_branch_arms_reversed
| NONTERM_instr | NONTERM_instr
| NONTERM_operands | NONTERM_operands
| NONTERM_operands_reversed
| NONTERM_operand | NONTERM_operand
// This function maps tokens to integer indexes // This function maps tokens to integer indexes
@@ -79,18 +82,21 @@ let prodIdxToNonTerminal (prodIdx:int) =
| 0 -> NONTERM__startrung | 0 -> NONTERM__startrung
| 1 -> NONTERM_rung | 1 -> NONTERM_rung
| 2 -> NONTERM_steps | 2 -> NONTERM_steps
| 3 -> NONTERM_steps | 3 -> NONTERM_steps_reversed
| 4 -> NONTERM_steps | 4 -> NONTERM_steps_reversed
| 5 -> NONTERM_branch | 5 -> NONTERM_steps_reversed
| 6 -> NONTERM_branch_arms | 6 -> NONTERM_branch
| 7 -> NONTERM_branch_arms | 7 -> NONTERM_branch_arms
| 8 -> NONTERM_branch_arms | 8 -> NONTERM_branch_arms_reversed
| 9 -> NONTERM_instr | 9 -> NONTERM_branch_arms_reversed
| 10 -> NONTERM_operands | 10 -> NONTERM_branch_arms_reversed
| 11 -> NONTERM_operands | 11 -> NONTERM_instr
| 12 -> NONTERM_operands | 12 -> NONTERM_operands
| 13 -> NONTERM_operand | 13 -> NONTERM_operands_reversed
| 14 -> NONTERM_operand | 14 -> NONTERM_operands_reversed
| 15 -> NONTERM_operands_reversed
| 16 -> NONTERM_operand
| 17 -> NONTERM_operand
| _ -> failwith "prodIdxToNonTerminal: bad production index" | _ -> failwith "prodIdxToNonTerminal: bad production index"
let _fsyacc_endOfInputTag = 11 let _fsyacc_endOfInputTag = 11
@@ -121,18 +127,18 @@ let _fsyacc_dataOfToken (t:token) =
| RIGHT_PAREN -> (null : System.Object) | RIGHT_PAREN -> (null : System.Object)
| LEFT_PAREN -> (null : System.Object) | LEFT_PAREN -> (null : System.Object)
| IDENTIFIER _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x | IDENTIFIER _fsyacc_x -> Microsoft.FSharp.Core.Operators.box _fsyacc_x
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_gotos = [| 0us;65535us;1us;65535us;0us;1us;3us;65535us;0us;2us;8us;14us;12us;13us;3us;65535us;0us;5us;8us;5us;12us;5us;1us;65535us;5us;7us;1us;65535us;8us;9us;1us;65535us;8us;11us;1us;65535us;5us;6us;1us;65535us;16us;17us;1us;65535us;16us;19us;2us;65535us;16us;22us;20us;21us;|]
let _fsyacc_sparseGotoTableRowOffsets = [|0us;1us;3us;9us;15us;18us;24us;27us;|] let _fsyacc_sparseGotoTableRowOffsets = [|0us;1us;3us;7us;11us;13us;15us;17us;19us;21us;23us;|]
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_stateToProdIdxsTableElements = [| 1us;0us;1us;0us;1us;1us;1us;1us;1us;1us;3us;2us;4us;5us;1us;4us;1us;5us;1us;6us;1us;6us;1us;6us;2us;7us;9us;1us;9us;1us;9us;1us;10us;1us;11us;1us;11us;1us;11us;1us;11us;2us;12us;14us;1us;14us;1us;14us;1us;15us;1us;16us;1us;17us;|]
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_stateToProdIdxsTableRowOffsets = [|0us;2us;4us;6us;8us;10us;14us;16us;18us;20us;22us;24us;27us;29us;31us;33us;35us;37us;39us;41us;44us;46us;48us;50us;52us;|]
let _fsyacc_action_rows = 24 let _fsyacc_action_rows = 25
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_actionTableElements = [|0us;16387us;0us;49152us;1us;32768us;2us;3us;1us;32768us;0us;4us;0us;16385us;2us;16386us;5us;8us;8us;15us;0us;16388us;0us;16389us;0us;16387us;1us;32768us;4us;10us;0us;16390us;1us;16391us;3us;12us;0us;16387us;0us;16393us;0us;16394us;1us;32768us;7us;16us;2us;16397us;1us;24us;8us;23us;1us;32768us;6us;18us;0us;16395us;1us;16396us;3us;20us;2us;32768us;1us;24us;8us;23us;0us;16398us;0us;16399us;0us;16400us;0us;16401us;|]
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_actionTableRowOffsets = [|0us;1us;2us;4us;6us;7us;10us;11us;12us;13us;15us;16us;18us;19us;20us;21us;23us;26us;28us;29us;31us;34us;35us;36us;37us;|]
let _fsyacc_reductionSymbolCounts = [|1us;3us;0us;2us;2us;3us;0us;3us;1us;4us;0us;3us;1us;1us;1us;|] let _fsyacc_reductionSymbolCounts = [|1us;3us;1us;0us;2us;2us;3us;1us;0us;3us;1us;4us;1us;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_productionToNonTerminalTable = [|0us;1us;2us;3us;3us;3us;4us;5us;6us;6us;6us;7us;8us;9us;9us;9us;10us;10us;|]
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_immediateActions = [|65535us;49152us;65535us;65535us;16385us;65535us;16388us;16389us;65535us;65535us;16390us;65535us;65535us;16393us;16394us;65535us;65535us;65535us;16395us;65535us;65535us;16398us;16399us;16400us;16401us;|]
let _fsyacc_reductions = lazy [| let _fsyacc_reductions = lazy [|
# 135 "Parser.fs" # 141 "Parser.fs"
(fun (parseState : FSharp.Text.Parsing.IParseState) -> (fun (parseState : FSharp.Text.Parsing.IParseState) ->
let _1 = parseState.GetInput(1) :?> Rung in let _1 = parseState.GetInput(1) :?> Rung in
Microsoft.FSharp.Core.Operators.box Microsoft.FSharp.Core.Operators.box
@@ -141,7 +147,7 @@ let _fsyacc_reductions = lazy [|
raise (FSharp.Text.Parsing.Accept(Microsoft.FSharp.Core.Operators.box _1)) raise (FSharp.Text.Parsing.Accept(Microsoft.FSharp.Core.Operators.box _1))
) )
: 'gentype__startrung)); : 'gentype__startrung));
# 144 "Parser.fs" # 150 "Parser.fs"
(fun (parseState : FSharp.Text.Parsing.IParseState) -> (fun (parseState : FSharp.Text.Parsing.IParseState) ->
let _1 = parseState.GetInput(1) :?> 'gentype_steps in let _1 = parseState.GetInput(1) :?> 'gentype_steps in
Microsoft.FSharp.Core.Operators.box Microsoft.FSharp.Core.Operators.box
@@ -152,152 +158,185 @@ let _fsyacc_reductions = lazy [|
) )
# 26 "Parser.fsy" # 26 "Parser.fsy"
: Rung)); : Rung));
# 155 "Parser.fs" # 161 "Parser.fs"
(fun (parseState : FSharp.Text.Parsing.IParseState) -> (fun (parseState : FSharp.Text.Parsing.IParseState) ->
let _1 = parseState.GetInput(1) :?> 'gentype_steps_reversed in
Microsoft.FSharp.Core.Operators.box Microsoft.FSharp.Core.Operators.box
( (
( (
# 29 "Parser.fsy" # 29 "Parser.fsy"
List.rev _1
)
# 29 "Parser.fsy"
: 'gentype_steps));
# 172 "Parser.fs"
(fun (parseState : FSharp.Text.Parsing.IParseState) ->
Microsoft.FSharp.Core.Operators.box
(
(
# 32 "Parser.fsy"
[] []
) )
# 29 "Parser.fsy" # 32 "Parser.fsy"
: 'gentype_steps)); : 'gentype_steps_reversed));
# 165 "Parser.fs" # 182 "Parser.fs"
(fun (parseState : FSharp.Text.Parsing.IParseState) -> (fun (parseState : FSharp.Text.Parsing.IParseState) ->
let _1 = parseState.GetInput(1) :?> 'gentype_instr in let _1 = parseState.GetInput(1) :?> 'gentype_steps_reversed in
let _2 = parseState.GetInput(2) :?> 'gentype_steps in let _2 = parseState.GetInput(2) :?> 'gentype_instr in
Microsoft.FSharp.Core.Operators.box Microsoft.FSharp.Core.Operators.box
( (
( (
# 30 "Parser.fsy" # 33 "Parser.fsy"
StepInstr _1 :: _2 StepInstr _2 :: _1
) )
# 30 "Parser.fsy" # 33 "Parser.fsy"
: 'gentype_steps)); : 'gentype_steps_reversed));
# 177 "Parser.fs" # 194 "Parser.fs"
(fun (parseState : FSharp.Text.Parsing.IParseState) -> (fun (parseState : FSharp.Text.Parsing.IParseState) ->
let _1 = parseState.GetInput(1) :?> 'gentype_branch in let _1 = parseState.GetInput(1) :?> 'gentype_steps_reversed in
let _2 = parseState.GetInput(2) :?> 'gentype_steps in let _2 = parseState.GetInput(2) :?> 'gentype_branch in
Microsoft.FSharp.Core.Operators.box Microsoft.FSharp.Core.Operators.box
( (
( (
# 31 "Parser.fsy" # 34 "Parser.fsy"
StepBranch _1 :: _2 StepBranch _2 :: _1
) )
# 31 "Parser.fsy" # 34 "Parser.fsy"
: 'gentype_steps)); : 'gentype_steps_reversed));
# 189 "Parser.fs" # 206 "Parser.fs"
(fun (parseState : FSharp.Text.Parsing.IParseState) -> (fun (parseState : FSharp.Text.Parsing.IParseState) ->
let _2 = parseState.GetInput(2) :?> 'gentype_branch_arms in let _2 = parseState.GetInput(2) :?> 'gentype_branch_arms in
Microsoft.FSharp.Core.Operators.box Microsoft.FSharp.Core.Operators.box
( (
( (
# 34 "Parser.fsy" # 37 "Parser.fsy"
Branch _2 Branch _2
) )
# 34 "Parser.fsy" # 37 "Parser.fsy"
: 'gentype_branch)); : 'gentype_branch));
# 200 "Parser.fs" # 217 "Parser.fs"
(fun (parseState : FSharp.Text.Parsing.IParseState) ->
let _1 = parseState.GetInput(1) :?> 'gentype_branch_arms_reversed in
Microsoft.FSharp.Core.Operators.box
(
(
# 40 "Parser.fsy"
List.rev _1
)
# 40 "Parser.fsy"
: 'gentype_branch_arms));
# 228 "Parser.fs"
(fun (parseState : FSharp.Text.Parsing.IParseState) -> (fun (parseState : FSharp.Text.Parsing.IParseState) ->
Microsoft.FSharp.Core.Operators.box Microsoft.FSharp.Core.Operators.box
( (
( (
# 37 "Parser.fsy" # 43 "Parser.fsy"
[] []
) )
# 37 "Parser.fsy" # 43 "Parser.fsy"
: 'gentype_branch_arms)); : 'gentype_branch_arms_reversed));
# 210 "Parser.fs" # 238 "Parser.fs"
(fun (parseState : FSharp.Text.Parsing.IParseState) -> (fun (parseState : FSharp.Text.Parsing.IParseState) ->
let _1 = parseState.GetInput(1) :?> 'gentype_steps in let _1 = parseState.GetInput(1) :?> 'gentype_branch_arms_reversed in
let _3 = parseState.GetInput(3) :?> 'gentype_branch_arms in let _3 = parseState.GetInput(3) :?> 'gentype_steps in
Microsoft.FSharp.Core.Operators.box Microsoft.FSharp.Core.Operators.box
( (
( (
# 38 "Parser.fsy" # 44 "Parser.fsy"
BranchArm _1 :: _3 BranchArm _3 :: _1
) )
# 38 "Parser.fsy" # 44 "Parser.fsy"
: 'gentype_branch_arms)); : 'gentype_branch_arms_reversed));
# 222 "Parser.fs" # 250 "Parser.fs"
(fun (parseState : FSharp.Text.Parsing.IParseState) -> (fun (parseState : FSharp.Text.Parsing.IParseState) ->
let _1 = parseState.GetInput(1) :?> 'gentype_steps in let _1 = parseState.GetInput(1) :?> 'gentype_steps in
Microsoft.FSharp.Core.Operators.box Microsoft.FSharp.Core.Operators.box
( (
( (
# 39 "Parser.fsy" # 45 "Parser.fsy"
[ BranchArm _1 ] [ BranchArm _1 ]
) )
# 39 "Parser.fsy" # 45 "Parser.fsy"
: 'gentype_branch_arms)); : 'gentype_branch_arms_reversed));
# 233 "Parser.fs" # 261 "Parser.fs"
(fun (parseState : FSharp.Text.Parsing.IParseState) -> (fun (parseState : FSharp.Text.Parsing.IParseState) ->
let _1 = parseState.GetInput(1) :?> string in let _1 = parseState.GetInput(1) :?> string in
let _3 = parseState.GetInput(3) :?> 'gentype_operands in let _3 = parseState.GetInput(3) :?> 'gentype_operands in
Microsoft.FSharp.Core.Operators.box Microsoft.FSharp.Core.Operators.box
( (
( (
# 42 "Parser.fsy" # 48 "Parser.fsy"
{ Op = _1; Args = _3 } { Op = _1; Args = _3 }
) )
# 42 "Parser.fsy" # 48 "Parser.fsy"
: 'gentype_instr)); : 'gentype_instr));
# 245 "Parser.fs" # 273 "Parser.fs"
(fun (parseState : FSharp.Text.Parsing.IParseState) ->
let _1 = parseState.GetInput(1) :?> 'gentype_operands_reversed in
Microsoft.FSharp.Core.Operators.box
(
(
# 51 "Parser.fsy"
List.rev _1
)
# 51 "Parser.fsy"
: 'gentype_operands));
# 284 "Parser.fs"
(fun (parseState : FSharp.Text.Parsing.IParseState) -> (fun (parseState : FSharp.Text.Parsing.IParseState) ->
Microsoft.FSharp.Core.Operators.box Microsoft.FSharp.Core.Operators.box
( (
( (
# 45 "Parser.fsy" # 54 "Parser.fsy"
[] []
) )
# 45 "Parser.fsy" # 54 "Parser.fsy"
: 'gentype_operands)); : 'gentype_operands_reversed));
# 255 "Parser.fs" # 294 "Parser.fs"
(fun (parseState : FSharp.Text.Parsing.IParseState) -> (fun (parseState : FSharp.Text.Parsing.IParseState) ->
let _1 = parseState.GetInput(1) :?> 'gentype_operand in let _1 = parseState.GetInput(1) :?> 'gentype_operands_reversed in
let _3 = parseState.GetInput(3) :?> 'gentype_operands in let _3 = parseState.GetInput(3) :?> 'gentype_operand in
Microsoft.FSharp.Core.Operators.box Microsoft.FSharp.Core.Operators.box
( (
( (
# 46 "Parser.fsy" # 55 "Parser.fsy"
_1 :: _3 _3 :: _1
) )
# 46 "Parser.fsy" # 55 "Parser.fsy"
: 'gentype_operands)); : 'gentype_operands_reversed));
# 267 "Parser.fs" # 306 "Parser.fs"
(fun (parseState : FSharp.Text.Parsing.IParseState) -> (fun (parseState : FSharp.Text.Parsing.IParseState) ->
let _1 = parseState.GetInput(1) :?> 'gentype_operand in let _1 = parseState.GetInput(1) :?> 'gentype_operand in
Microsoft.FSharp.Core.Operators.box Microsoft.FSharp.Core.Operators.box
( (
( (
# 47 "Parser.fsy" # 56 "Parser.fsy"
[ _1 ] [ _1 ]
) )
# 47 "Parser.fsy" # 56 "Parser.fsy"
: 'gentype_operands)); : 'gentype_operands_reversed));
# 278 "Parser.fs" # 317 "Parser.fs"
(fun (parseState : FSharp.Text.Parsing.IParseState) -> (fun (parseState : FSharp.Text.Parsing.IParseState) ->
let _1 = parseState.GetInput(1) :?> string in let _1 = parseState.GetInput(1) :?> string in
Microsoft.FSharp.Core.Operators.box Microsoft.FSharp.Core.Operators.box
( (
( (
# 50 "Parser.fsy" # 59 "Parser.fsy"
OperandTag _1 OperandTag _1
) )
# 50 "Parser.fsy" # 59 "Parser.fsy"
: 'gentype_operand)); : 'gentype_operand));
# 289 "Parser.fs" # 328 "Parser.fs"
(fun (parseState : FSharp.Text.Parsing.IParseState) -> (fun (parseState : FSharp.Text.Parsing.IParseState) ->
Microsoft.FSharp.Core.Operators.box Microsoft.FSharp.Core.Operators.box
( (
( (
# 51 "Parser.fsy" # 60 "Parser.fsy"
OperandHole OperandHole
) )
# 51 "Parser.fsy" # 60 "Parser.fsy"
: 'gentype_operand)); : 'gentype_operand));
|] |]
# 300 "Parser.fs" # 339 "Parser.fs"
let tables : FSharp.Text.Parsing.Tables<_> = let tables : FSharp.Text.Parsing.Tables<_> =
{ reductions = _fsyacc_reductions.Value; { reductions = _fsyacc_reductions.Value;
endOfInputTag = _fsyacc_endOfInputTag; endOfInputTag = _fsyacc_endOfInputTag;

View File

@@ -26,10 +26,13 @@ type nonTerminalId =
| NONTERM__startrung | NONTERM__startrung
| NONTERM_rung | NONTERM_rung
| NONTERM_steps | NONTERM_steps
| NONTERM_steps_reversed
| NONTERM_branch | NONTERM_branch
| NONTERM_branch_arms | NONTERM_branch_arms
| NONTERM_branch_arms_reversed
| NONTERM_instr | NONTERM_instr
| NONTERM_operands | NONTERM_operands
| NONTERM_operands_reversed
| NONTERM_operand | NONTERM_operand
/// This function maps tokens to integer indexes /// This function maps tokens to integer indexes
val tagOfToken: token -> int val tagOfToken: token -> int

View File

@@ -26,24 +26,33 @@ rung:
| steps SEMICOLON EOF { Rung $1 } | steps SEMICOLON EOF { Rung $1 }
steps: steps:
| steps_reversed { List.rev $1 }
steps_reversed:
| { [] } | { [] }
| instr steps { StepInstr $1 :: $2 } | steps_reversed instr { StepInstr $2 :: $1 }
| branch steps { StepBranch $1 :: $2 } | steps_reversed branch { StepBranch $2 :: $1 }
branch: branch:
| LEFT_BRACKET branch_arms RIGHT_BRACKET { Branch $2 } | LEFT_BRACKET branch_arms RIGHT_BRACKET { Branch $2 }
branch_arms: branch_arms:
| branch_arms_reversed { List.rev $1 }
branch_arms_reversed:
| { [] } | { [] }
| steps COMMA branch_arms { BranchArm $1 :: $3} | branch_arms_reversed COMMA steps { BranchArm $3 :: $1}
| steps { [ BranchArm $1 ] } | steps { [ BranchArm $1 ] }
instr: instr:
| IDENTIFIER LEFT_PAREN operands RIGHT_PAREN { { Op = $1; Args = $3 } } | IDENTIFIER LEFT_PAREN operands RIGHT_PAREN { { Op = $1; Args = $3 } }
operands: operands:
| operands_reversed { List.rev $1 }
operands_reversed:
| { [] } | { [] }
| operand COMMA operands { $1 :: $3 } | operands_reversed COMMA operand { $3 :: $1 }
| operand { [ $1 ] } | operand { [ $1 ] }
operand: operand:

View File

@@ -21,7 +21,7 @@ let parse (s:string) =
parse "abc();" parse "abc();"
parse "abc(def);" parse "abc(def);"
parse "abc(def,ghi);" parse "abc(def,ghi);"
parse "abc(def,ghi) a(b) ;" parse "abc(def,ghi) j(k) ;"
parse "a() [ b() c(), d(), , e() [ f() ] g() ] h();" parse "a() [ b() c(), d(), , e() [ f() ] g() ] h();"
if failed then exit 1 else exit 0 if failed then exit 1 else exit 0