diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2016-09-10 10:43:19 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2016-09-10 10:43:19 -0700 |
commit | 44c1aeef226542d692f0002b5cca5a3c30935d18 (patch) | |
tree | 46452902ff779d93e4adcb57cda29d923766a5be /html/017parse_tree.cc.html | |
parent | c7db6a160a9a43d0905d5dea44e742b47acfa42f (diff) | |
download | mu-44c1aeef226542d692f0002b5cca5a3c30935d18.tar.gz |
3315
Diffstat (limited to 'html/017parse_tree.cc.html')
-rw-r--r-- | html/017parse_tree.cc.html | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/html/017parse_tree.cc.html b/html/017parse_tree.cc.html index 015ffe60..0acbc8cc 100644 --- a/html/017parse_tree.cc.html +++ b/html/017parse_tree.cc.html @@ -35,6 +35,11 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color <span class="Comment">// support for more complex trees of properties in dilated reagents. This will</span> <span class="Comment">// come in handy later for expressing complex types, like "a dictionary from</span> <span class="Comment">// (address to array of charaters) to (list of numbers)".</span> +<span class="Comment">//</span> +<span class="Comment">// Type trees aren't as general as s-expressions even if they look like them:</span> +<span class="Comment">// the first element of a type tree is always an atom, and left and right</span> +<span class="Comment">// pointers of non-atoms are never NULL. All type trees are 'dotted' in lisp</span> +<span class="Comment">// parlance.</span> <span class="Delimiter">:(scenarios load)</span> <span class="Delimiter">:(scenario dilated_reagent_with_nested_brackets)</span> @@ -43,14 +48,14 @@ def main [ ] <span class="traceContains">+parse: product: {1: "number", "foo": ("bar" ("baz" "quux"))}</span> -<span class="Delimiter">:(before "End Parsing Reagent Property(value)")</span> -value = parse_string_tree<span class="Delimiter">(</span>value<span class="Delimiter">);</span> -<span class="Delimiter">:(before "End Parsing Reagent Type Property(value)")</span> +<span class="Delimiter">:(before "End Parsing Dilated Reagent Property(value)")</span> value = parse_string_tree<span class="Delimiter">(</span>value<span class="Delimiter">);</span> +<span class="Delimiter">:(before "End Parsing Dilated Reagent Type Property(type_names)")</span> +type_names = parse_string_tree<span class="Delimiter">(</span>type_names<span class="Delimiter">);</span> <span class="Delimiter">:(code)</span> string_tree* parse_string_tree<span class="Delimiter">(</span>string_tree* s<span class="Delimiter">)</span> <span class="Delimiter">{</span> - assert<span class="Delimiter">(</span>!s<span class="Delimiter">-></span>left && !s<span class="Delimiter">-></span>right<span class="Delimiter">);</span> + assert<span class="Delimiter">(</span>s<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> <span class="Normal">if</span> <span class="Delimiter">(</span>s<span class="Delimiter">-></span>value<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> != <span class="Constant">'('</span><span class="Delimiter">)</span> <span class="Identifier">return</span> s<span class="Delimiter">;</span> string_tree* result = parse_string_tree<span class="Delimiter">(</span>s<span class="Delimiter">-></span>value<span class="Delimiter">);</span> <span class="Normal">delete</span> s<span class="Delimiter">;</span> @@ -77,17 +82,30 @@ string_tree* parse_string_tree<span class="Delimiter">(</span>istream& in<sp in<span class="Delimiter">.</span>get<span class="Delimiter">();</span> <span class="Comment">// skip '('</span> string_tree* result = <span class="Constant">NULL</span><span class="Delimiter">;</span> string_tree** curr = &result<span class="Delimiter">;</span> - <span class="Normal">while</span> <span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="Constant">')'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> - assert<span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> - *curr = <span class="Normal">new</span> string_tree<span class="Delimiter">(</span><span class="Constant">""</span><span class="Delimiter">);</span> + <span class="Normal">while</span> <span class="Delimiter">(</span><span class="Constant">true</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span> + assert<span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> + <span class="Normal">if</span> <span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> == <span class="Constant">')'</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span> + *curr = <span class="Normal">new</span> string_tree<span class="Delimiter">(</span><span class="Constant">NULL</span><span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">);</span> <span class="Normal">if</span> <span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> == <span class="Constant">'('</span><span class="Delimiter">)</span> <span class="Delimiter">(</span>*curr<span class="Delimiter">)-></span>left = parse_string_tree<span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span class="Normal">else</span> - <span class="Delimiter">(</span>*curr<span class="Delimiter">)-></span>value = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span> + <span class="Delimiter">(</span>*curr<span class="Delimiter">)-></span>left = <span class="Normal">new</span> string_tree<span class="Delimiter">(</span>next_word<span class="Delimiter">(</span>in<span class="Delimiter">));</span> curr = &<span class="Delimiter">(</span>*curr<span class="Delimiter">)-></span>right<span class="Delimiter">;</span> <span class="Delimiter">}</span> in<span class="Delimiter">.</span>get<span class="Delimiter">();</span> <span class="Comment">// skip ')'</span> + assert<span class="Delimiter">(</span>*curr == <span class="Constant">NULL</span><span class="Delimiter">);</span> + <span class="Comment">// standardize the final element to always be on the right if it's an atom</span> + <span class="Comment">// (a b c) => (a b . c) in s-expression parlance</span> + string_tree* tmp = result<span class="Delimiter">;</span> + <span class="Normal">while</span> <span class="Delimiter">(</span>tmp<span class="Delimiter">-></span>right && tmp<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">)</span> tmp = tmp<span class="Delimiter">-></span>right<span class="Delimiter">;</span> + assert<span class="Delimiter">(</span>!tmp<span class="Delimiter">-></span>right<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> + <span class="Normal">if</span> <span class="Delimiter">(</span>!tmp<span class="Delimiter">-></span>right<span class="Delimiter">-></span>left<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> + string_tree* tmp2 = tmp<span class="Delimiter">-></span>right<span class="Delimiter">;</span> + tmp<span class="Delimiter">-></span>right = tmp2<span class="Delimiter">-></span>left<span class="Delimiter">;</span> + tmp2<span class="Delimiter">-></span>left = <span class="Constant">NULL</span><span class="Delimiter">;</span> + assert<span class="Delimiter">(</span>tmp2<span class="Delimiter">-></span>right == <span class="Constant">NULL</span><span class="Delimiter">);</span> + <span class="Normal">delete</span> tmp2<span class="Delimiter">;</span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span class="Delimiter">}</span> |