@@ -41,9 +41,9 @@ primitive PegCompiler
4141
4242 if errors.size () == 0 then
4343 try
44- (var start: Parser , _) = defs (" start" )
44+ (var start: Parser , _) = defs (" start" )?
4545 if defs.contains (" hidden" ) then
46- start = start.hide (defs (" hidden" )._1 )
46+ start = start.hide (defs (" hidden" )? ._1 )
4747 end
4848 return start
4949 end
@@ -53,11 +53,11 @@ primitive PegCompiler
5353
5454 fun _forward_definition (errors: Array [PegError ], defs: Defs , ast: AST ) =>
5555 try
56- let token = ast.children (0 ) as Token
56+ let token = ast.children (0 )? as Token
5757 let ident: String = token.string ()
5858
5959 if defs.contains (ident) then
60- (_, let prev) = defs (ident)
60+ (_, let prev) = defs (ident)?
6161 errors.push (DuplicateDefinition (token, prev))
6262 else
6363 defs (ident) = (Forward , token)
@@ -66,12 +66,12 @@ primitive PegCompiler
6666
6767 fun _compile_definition (errors: Array [PegError ], defs: Defs , ast: AST ) =>
6868 try
69- let ident: String = (ast.children (0 ) as Token ).string ()
70- let rule = _compile_expr (errors, defs, ast.children (1 ))
71- (let p, _) = defs (ident)
69+ let ident: String = (ast.children (0 )? as Token ).string ()
70+ let rule = _compile_expr (errors, defs, ast.children (1 )? )
71+ (let p, _) = defs (ident)?
7272
7373 if not p.complete () then
74- let c = ident (0 )
74+ let c = ident (0 )?
7575 if (c >= 'A' ) and (c <= 'Z' ) then
7676 p () = rule.term (PegLabel (ident))
7777 else
@@ -93,42 +93,42 @@ primitive PegCompiler
9393 match node.label ()
9494 | PegChoice =>
9595 let ast = node as AST
96- var p = _compile_expr (errors, defs, ast.children (0 ))
96+ var p = _compile_expr (errors, defs, ast.children (0 )? )
9797 for i in Range (1 , ast.children .size ()) do
98- p = p / _compile_expr (errors, defs, ast.children (i))
98+ p = p / _compile_expr (errors, defs, ast.children (i)? )
9999 end
100100 p
101101 | PegSeq =>
102102 let ast = node as AST
103- var p = _compile_expr (errors, defs, ast.children (0 ))
103+ var p = _compile_expr (errors, defs, ast.children (0 )? )
104104 for i in Range (1 , ast.children .size ()) do
105- p = p * _compile_expr (errors, defs, ast.children (i))
105+ p = p * _compile_expr (errors, defs, ast.children (i)? )
106106 end
107107 p
108108 | PegSkip =>
109- -_compile_expr (errors, defs, (node as AST ).children (0 ))
109+ -_compile_expr (errors, defs, (node as AST ).children (0 )? )
110110 | PegNot =>
111- not _compile_expr (errors, defs, (node as AST ).children (0 ))
111+ not _compile_expr (errors, defs, (node as AST ).children (0 )? )
112112 | PegAnd =>
113- not not _compile_expr (errors, defs, (node as AST ).children (0 ))
113+ not not _compile_expr (errors, defs, (node as AST ).children (0 )? )
114114 | PegMany1 =>
115- _compile_expr (errors, defs, (node as AST ).children (0 )).many1 ()
115+ _compile_expr (errors, defs, (node as AST ).children (0 )? ).many1 ()
116116 | PegMany =>
117- _compile_expr (errors, defs, (node as AST ).children (0 )).many ()
117+ _compile_expr (errors, defs, (node as AST ).children (0 )? ).many ()
118118 | PegSep1 =>
119119 let ast = node as AST
120- let sep = _compile_expr (errors, defs, ast.children (1 ))
121- _compile_expr (errors, defs, ast.children (0 )).many1 (sep)
120+ let sep = _compile_expr (errors, defs, ast.children (1 )? )
121+ _compile_expr (errors, defs, ast.children (0 )? ).many1 (sep)
122122 | PegSep =>
123123 let ast = node as AST
124- let sep = _compile_expr (errors, defs, ast.children (1 ))
125- _compile_expr (errors, defs, ast.children (0 )).many (sep)
124+ let sep = _compile_expr (errors, defs, ast.children (1 )? )
125+ _compile_expr (errors, defs, ast.children (0 )? ).many (sep)
126126 | PegOpt =>
127- _compile_expr (errors, defs, (node as AST ).children (0 )).opt ()
127+ _compile_expr (errors, defs, (node as AST ).children (0 )? ).opt ()
128128 | PegRange =>
129129 let ast = node as AST
130- let a = _unescape (ast.children (0 ) as Token ).utf32 (0 )._1
131- let b = _unescape (ast.children (1 ) as Token ).utf32 (0 )._1
130+ let a = _unescape (ast.children (0 )? as Token ).utf32 (0 )? ._1
131+ let b = _unescape (ast.children (1 )? as Token ).utf32 (0 )? ._1
132132 R (a, b)
133133 | PegIdent =>
134134 let token = node as Token
@@ -137,7 +137,7 @@ primitive PegCompiler
137137 errors.push (MissingDefinition (token))
138138 NoParser
139139 else
140- defs (ident)._1
140+ defs (ident)? ._1
141141 end
142142 | PegAny =>
143143 R (' ' )
0 commit comments