Implement a stack of position markers to delay the insertion of an opening tag until...
authorNick Downing <nick@ndcode.org>
Mon, 21 Jan 2019 01:45:08 +0000 (12:45 +1100)
committerNick Downing <nick@ndcode.org>
Mon, 21 Jan 2019 01:45:08 +0000 (12:45 +1100)
bootstrap/scan-gram.l
scan-gram.l

index 5f1ba6b..009267d 100644 (file)
@@ -38,6 +38,7 @@
   gram_piece = []
   gram_piece0 = 0
   gram_piece1 = 0
+  markup_stack = []
 
   percent_percent_count = 0;
 
@@ -286,9 +287,9 @@ eqopt    ([[:space:]]*=)?
     token_start = y_tab.yylloc.start
     BEGIN(SC_ESCAPED_CHARACTER)
     gram_piece_pack()
-    gram_piece_append('<AST_Char>')
+    markup_stack.append(len(gram_piece)) # <AST_Char>
     gram_piece_flush(len(yytext))
-    gram_piece_append('<AST_Text>')
+    markup_stack.append(len(gram_piece)) # <AST_Text>
   }
 
   /* Strings. */
@@ -297,9 +298,9 @@ eqopt    ([[:space:]]*=)?
     token_start = y_tab.yylloc.start
     BEGIN(SC_ESCAPED_STRING)
     gram_piece_pack()
-    gram_piece_append('<AST_String>')
+    markup_stack.append(len(gram_piece)) # <AST_String>
     gram_piece_flush(len(yytext))
-    gram_piece_append('<AST_Text>')
+    markup_stack.append(len(gram_piece)) # <AST_Text>
   }
 
   /* Prologue. */
@@ -308,9 +309,9 @@ eqopt    ([[:space:]]*=)?
     code_start = y_tab.yylloc.start
     BEGIN(SC_PROLOGUE)
     gram_piece_pack()
-    gram_piece_append('<AST_Section1_Prologue>')
+    markup_stack.append(len(gram_piece)) # <AST_Section1_Prologue>
     gram_piece_flush(len(yytext))
-    gram_piece_append('<AST_Text>')
+    markup_stack.append(len(gram_piece)) # <AST_Text>
   }
 
   /* Code in between braces.  */
@@ -321,9 +322,9 @@ eqopt    ([[:space:]]*=)?
     code_start = y_tab.yylloc.start
     BEGIN(SC_BRACED_CODE)
     gram_piece_pack()
-    gram_piece_append('<AST_BracedCode>')
+    markup_stack.append(len(gram_piece)) # <AST_BracedCode>
     gram_piece_flush(len(yytext))
-    gram_piece_append('<AST_Text>')
+    markup_stack.append(len(gram_piece)) # <AST_Text>
   }
 
   /* Semantic predicate. */
@@ -332,9 +333,9 @@ eqopt    ([[:space:]]*=)?
     nesting = 0
     code_start = y_tab.yylloc.start
     gram_piece_pack()
-    gram_piece_append('<AST_BracedPredicate>')
+    markup_stack.append(len(gram_piece)) # <AST_BracedPredicate>
     gram_piece_flush(len(yytext))
-    gram_piece_append('<AST_Text>')
+    markup_stack.append(len(gram_piece)) # <AST_Text>
     BEGIN(SC_PREDICATE)
   }
 
@@ -347,7 +348,7 @@ eqopt    ([[:space:]]*=)?
     BEGIN(SC_ELEMENT_GROUP)
     gram_piece_pack()
     gram_piece_flush(len(yytext))
-    gram_piece_append('<AST_Text>')
+    markup_stack.append(len(gram_piece)) # <AST_Text>
   }
   ")"                          return ord(')')
 
@@ -368,9 +369,9 @@ eqopt    ([[:space:]]*=)?
     token_start = y_tab.yylloc.start
     BEGIN(SC_TAG)
     gram_piece_pack()
-    gram_piece_append('<AST_TagRef>')
+    markup_stack.append(len(gram_piece)) # <AST_TagRef>
     gram_piece_flush(len(yytext))
-    gram_piece_append('<AST_Text>')
+    markup_stack.append(len(gram_piece)) # <AST_Text>
   }
 
   "%%" {
@@ -565,8 +566,10 @@ eqopt    ([[:space:]]*=)?
     y_tab.yylloc.start = token_start
     y_tab.yylval = gram_last_string
     BEGIN(INITIAL)
+    gram_piece_insert(markup_stack.pop(), '<AST_Text>')
     gram_piece_append('</AST_Text>')
     gram_piece_escape(yytext)
+    gram_piece_insert(markup_stack.pop(), '<AST_String>')
     gram_piece_append('</AST_String>')
     gram_piece_pack()
     return ~y_tab.STRING
@@ -596,8 +599,10 @@ eqopt    ([[:space:]]*=)?
       y_tab.yylval = ord(gram_last_string[0])
     #del obstack_for_string[:]
     BEGIN(INITIAL)
+    gram_piece_insert(markup_stack.pop(), '<AST_Text>')
     gram_piece_append('</AST_Text>')
     gram_piece_escape(yytext)
+    gram_piece_insert(markup_stack.pop(), '<AST_Char>')
     gram_piece_append('</AST_Char>')
     gram_piece_pack()
     return ~y_tab.CHAR
@@ -624,8 +629,10 @@ eqopt    ([[:space:]]*=)?
       y_tab.yylval = gram_last_string
       #del obstack_for_string[:]
       BEGIN(INITIAL)
+      gram_piece_insert(markup_stack.pop(), '<AST_Text>')
       gram_piece_append('</AST_Text>')
       gram_piece_escape(yytext)
+      gram_piece_insert(markup_stack.pop(), '<AST_TagRef>')
       gram_piece_append('</AST_TagRef>')
       gram_piece_pack()
       return ~y_tab.TAG
@@ -851,8 +858,10 @@ eqopt    ([[:space:]]*=)?
       y_tab.yylloc.start = code_start
       y_tab.yylval = gram_last_string
       BEGIN(INITIAL)
+      gram_piece_insert(markup_stack.pop(), '<AST_Text>')
       gram_piece_append('</AST_Text>')
       gram_piece_escape(yytext)
+      gram_piece_insert(markup_stack.pop(), '<AST_BracedCode>')
       gram_piece_append('</AST_BracedCode>')
       gram_piece_pack()
       return ~y_tab.BRACED_CODE
@@ -870,8 +879,10 @@ eqopt    ([[:space:]]*=)?
       y_tab.yylloc.start = code_start
       y_tab.yylval = gram_last_string
       BEGIN(INITIAL)
+      gram_piece_insert(markup_stack.pop(), '<AST_Text>')
       gram_piece_append('</AST_Text>')
       gram_piece_escape(yytext)
+      gram_piece_insert(markup_stack.pop(), '<AST_BracedPredicate>')
       gram_piece_append('</AST_BracedPredicate>')
       gram_piece_pack()
       return ~y_tab.BRACED_PREDICATE
@@ -894,6 +905,7 @@ eqopt    ([[:space:]]*=)?
       y_tab.yylval = gram_last_string
       #del obstack_for_string[:]
       BEGIN(INITIAL)
+      gram_piece_insert(markup_stack.pop(), '<AST_Text>')
       gram_piece_append('</AST_Text>')
       gram_piece_escape(yytext)
       gram_piece_pack()
@@ -914,8 +926,10 @@ eqopt    ([[:space:]]*=)?
     y_tab.yylloc.start = code_start
     y_tab.yylval = gram_last_string
     BEGIN(INITIAL)
+    gram_piece_insert(markup_stack.pop(), '<AST_Text>')
     gram_piece_append('</AST_Text>')
     gram_piece_escape(yytext)
+    gram_piece_insert(markup_stack.pop(), '<AST_Section1_Prologue>')
     gram_piece_append('</AST_Section1_Prologue>')
     gram_piece_pack()
     return ~y_tab.PROLOGUE
index 6b2b1b8..4b3a89b 100644 (file)
@@ -37,6 +37,7 @@
   gram_piece = []
   gram_piece0 = 0
   gram_piece1 = 0
+  markup_stack = []
 
   percent_percent_count = 0;
 
@@ -285,9 +286,9 @@ eqopt    ([[:space:]]*=)?
     token_start = y_tab.yylloc.start
     BEGIN(SC_ESCAPED_CHARACTER)
     gram_piece_pack()
-    gram_piece_append('<AST_Char>')
+    markup_stack.append(len(gram_piece)) # <AST_Char>
     gram_piece_flush(len(yytext))
-    gram_piece_append('<AST_Text>')
+    markup_stack.append(len(gram_piece)) # <AST_Text>
   }
 
   /* Strings. */
@@ -296,9 +297,9 @@ eqopt    ([[:space:]]*=)?
     token_start = y_tab.yylloc.start
     BEGIN(SC_ESCAPED_STRING)
     gram_piece_pack()
-    gram_piece_append('<AST_String>')
+    markup_stack.append(len(gram_piece)) # <AST_String>
     gram_piece_flush(len(yytext))
-    gram_piece_append('<AST_Text>')
+    markup_stack.append(len(gram_piece)) # <AST_Text>
   }
 
   /* Prologue. */
@@ -307,9 +308,9 @@ eqopt    ([[:space:]]*=)?
     code_start = y_tab.yylloc.start
     BEGIN(SC_PROLOGUE)
     gram_piece_pack()
-    gram_piece_append('<AST_Section1_Prologue>')
+    markup_stack.append(len(gram_piece)) # <AST_Section1_Prologue>
     gram_piece_flush(len(yytext))
-    gram_piece_append('<AST_Text>')
+    markup_stack.append(len(gram_piece)) # <AST_Text>
   }
 
   /* Code in between braces.  */
@@ -320,9 +321,9 @@ eqopt    ([[:space:]]*=)?
     code_start = y_tab.yylloc.start
     BEGIN(SC_BRACED_CODE)
     gram_piece_pack()
-    gram_piece_append('<AST_BracedCode>')
+    markup_stack.append(len(gram_piece)) # <AST_BracedCode>
     gram_piece_flush(len(yytext))
-    gram_piece_append('<AST_Text>')
+    markup_stack.append(len(gram_piece)) # <AST_Text>
   }
 
   /* Semantic predicate. */
@@ -331,9 +332,9 @@ eqopt    ([[:space:]]*=)?
     nesting = 0
     code_start = y_tab.yylloc.start
     gram_piece_pack()
-    gram_piece_append('<AST_BracedPredicate>')
+    markup_stack.append(len(gram_piece)) # <AST_BracedPredicate>
     gram_piece_flush(len(yytext))
-    gram_piece_append('<AST_Text>')
+    markup_stack.append(len(gram_piece)) # <AST_Text>
     BEGIN(SC_PREDICATE)
   }
 
@@ -346,7 +347,7 @@ eqopt    ([[:space:]]*=)?
     BEGIN(SC_ELEMENT_GROUP)
     gram_piece_pack()
     gram_piece_flush(len(yytext))
-    gram_piece_append('<AST_Text>')
+    markup_stack.append(len(gram_piece)) # <AST_Text>
   }
   ")"                          return ord(')')
 
@@ -367,9 +368,9 @@ eqopt    ([[:space:]]*=)?
     token_start = y_tab.yylloc.start
     BEGIN(SC_TAG)
     gram_piece_pack()
-    gram_piece_append('<AST_TagRef>')
+    markup_stack.append(len(gram_piece)) # <AST_TagRef>
     gram_piece_flush(len(yytext))
-    gram_piece_append('<AST_Text>')
+    markup_stack.append(len(gram_piece)) # <AST_Text>
   }
 
   "%%" {
@@ -564,8 +565,10 @@ eqopt    ([[:space:]]*=)?
     y_tab.yylloc.start = token_start
     y_tab.yylval = gram_last_string
     BEGIN(INITIAL)
+    gram_piece_insert(markup_stack.pop(), '<AST_Text>')
     gram_piece_append('</AST_Text>')
     gram_piece_escape(yytext)
+    gram_piece_insert(markup_stack.pop(), '<AST_String>')
     gram_piece_append('</AST_String>')
     gram_piece_pack()
     return ~y_tab.STRING
@@ -595,8 +598,10 @@ eqopt    ([[:space:]]*=)?
       y_tab.yylval = ord(gram_last_string[0])
     #del obstack_for_string[:]
     BEGIN(INITIAL)
+    gram_piece_insert(markup_stack.pop(), '<AST_Text>')
     gram_piece_append('</AST_Text>')
     gram_piece_escape(yytext)
+    gram_piece_insert(markup_stack.pop(), '<AST_Char>')
     gram_piece_append('</AST_Char>')
     gram_piece_pack()
     return ~y_tab.CHAR
@@ -623,8 +628,10 @@ eqopt    ([[:space:]]*=)?
       y_tab.yylval = gram_last_string
       #del obstack_for_string[:]
       BEGIN(INITIAL)
+      gram_piece_insert(markup_stack.pop(), '<AST_Text>')
       gram_piece_append('</AST_Text>')
       gram_piece_escape(yytext)
+      gram_piece_insert(markup_stack.pop(), '<AST_TagRef>')
       gram_piece_append('</AST_TagRef>')
       gram_piece_pack()
       return ~y_tab.TAG
@@ -850,8 +857,10 @@ eqopt    ([[:space:]]*=)?
       y_tab.yylloc.start = code_start
       y_tab.yylval = gram_last_string
       BEGIN(INITIAL)
+      gram_piece_insert(markup_stack.pop(), '<AST_Text>')
       gram_piece_append('</AST_Text>')
       gram_piece_escape(yytext)
+      gram_piece_insert(markup_stack.pop(), '<AST_BracedCode>')
       gram_piece_append('</AST_BracedCode>')
       gram_piece_pack()
       return ~y_tab.BRACED_CODE
@@ -869,8 +878,10 @@ eqopt    ([[:space:]]*=)?
       y_tab.yylloc.start = code_start
       y_tab.yylval = gram_last_string
       BEGIN(INITIAL)
+      gram_piece_insert(markup_stack.pop(), '<AST_Text>')
       gram_piece_append('</AST_Text>')
       gram_piece_escape(yytext)
+      gram_piece_insert(markup_stack.pop(), '<AST_BracedPredicate>')
       gram_piece_append('</AST_BracedPredicate>')
       gram_piece_pack()
       return ~y_tab.BRACED_PREDICATE
@@ -893,6 +904,7 @@ eqopt    ([[:space:]]*=)?
       y_tab.yylval = gram_last_string
       #del obstack_for_string[:]
       BEGIN(INITIAL)
+      gram_piece_insert(markup_stack.pop(), '<AST_Text>')
       gram_piece_append('</AST_Text>')
       gram_piece_escape(yytext)
       gram_piece_pack()
@@ -913,8 +925,10 @@ eqopt    ([[:space:]]*=)?
     y_tab.yylloc.start = code_start
     y_tab.yylval = gram_last_string
     BEGIN(INITIAL)
+    gram_piece_insert(markup_stack.pop(), '<AST_Text>')
     gram_piece_append('</AST_Text>')
     gram_piece_escape(yytext)
+    gram_piece_insert(markup_stack.pop(), '<AST_Section1_Prologue>')
     gram_piece_append('</AST_Section1_Prologue>')
     gram_piece_pack()
     return ~y_tab.PROLOGUE