[svn] r6097: nemerle/trunk/ncc/parsing: MainParser-Extensions.n MainParser.n

malekith svnadmin at nemerle.org
Mon Jan 30 15:27:47 CET 2006


Log:
Make macro syntax extension keywords hygienic for their scope (parm, method, whatever).

Author: malekith
Date: Mon Jan 30 15:27:46 2006
New Revision: 6097

Modified:
   nemerle/trunk/ncc/parsing/MainParser-Extensions.n
   nemerle/trunk/ncc/parsing/MainParser.n

Modified: nemerle/trunk/ncc/parsing/MainParser-Extensions.n
==============================================================================
--- nemerle/trunk/ncc/parsing/MainParser-Extensions.n	(original)
+++ nemerle/trunk/ncc/parsing/MainParser-Extensions.n	Mon Jan 30 15:27:46 2006
@@ -234,7 +234,7 @@
         match (peek_token ()) {
           | Token.Keyword (k) as tok =>
             match (env.SyntaxKeywords.Find (k)) {
-              | Some (ext) =>
+              | Some (ext) when ext.Target %&& target =>
                 shift ();
                 def (end, parms) = parse_grammar_rule (ext, TokenStoppers.None, target);
 
@@ -258,7 +258,7 @@
                 }
                 extensions ()
                 
-              | None => ()
+              | _ => ()
             }
           | _ => ()
         }

Modified: nemerle/trunk/ncc/parsing/MainParser.n
==============================================================================
--- nemerle/trunk/ncc/parsing/MainParser.n	(original)
+++ nemerle/trunk/ncc/parsing/MainParser.n	Mon Jan 30 15:27:46 2006
@@ -645,7 +645,7 @@
           mutable customs = get_customs ();
           def mods = Modifiers (get_modifiers (), []);
 
-          parse_top_extensions (mods, MacroTargets.All);
+          parse_top_extensions (mods, MacroTargets.All & ~MacroTargets.Parameter);
 
           def tok = peek_token ();
           def result = 
@@ -1567,14 +1567,14 @@
             | Token.Keyword (str)
             | Token.Operator (str) when str != "$" =>
               match (env.SyntaxKeywords.Find (str)) {
-                | Some (syntax_definition) =>
+                | Some (syntax_definition) when syntax_definition.Target %&& ((1 << 15) :> MacroTargets) =>
                   shift ();
                   _expr_stack = parse_syntax_definition (syntax_definition, stop) :: _expr_stack;
                   // after raw expression we are in postfix context
                   _op_context = OpContext.Postfix;
                   loop ()
 
-                | None =>
+                | _ =>
                   def info =
                     match (str) {
                       | "-" => OperatorInfo.UnMinus
@@ -2075,9 +2075,9 @@
             // here the expression syntax extensions are triggered, by first keyword
             // when it has some syntax definition attached
             match (env.SyntaxKeywords.Find (k)) {
-              | None => fatal_error (tok, "unexpected keyword in expression context");
-              | Some (syntax_definition) =>
+              | Some (syntax_definition) when syntax_definition.Target %&& ((1 << 15) :> MacroTargets) =>
                 parse_syntax_definition (syntax_definition, stop)                
+              | _ => fatal_error (tok, "unexpected keyword in expression context");
             }
 
           | _ => fatal_error (tok, "expecting expression");



More information about the svn mailing list