carbidev/com.nokia.tools.variant.confml.expressions_1.0.0.v20090225_01-11/src/com/nokia/tools/variant/confml/expressions/settings/Confml.g
changeset 0 30eb2d538f02
child 1 fe41c66bacc7
equal deleted inserted replaced
-1:000000000000 0:30eb2d538f02
       
     1 /*
       
     2  * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
       
     3  * All rights reserved.
       
     4  * This component and the accompanying materials are made available
       
     5  * under the terms of the License "Symbian Foundation License v1.0"
       
     6  * which accompanies this distribution, and is available
       
     7  * at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
       
     8  * 
       
     9  * Initial Contributors:
       
    10  * Nokia Corporation - Initial contribution
       
    11  * 
       
    12  * Contributors:
       
    13  * 
       
    14  * Description: This file is part of com.nokia.tools.variant.confml.expressions component.
       
    15  */
       
    16 grammar Confml;
       
    17  
       
    18 @header { 
       
    19   package com.nokia.tools.variant.confml.expressions.settings;
       
    20   
       
    21   import java.util.HashSet;
       
    22   import java.util.Set;
       
    23   import org.eclipse.emf.common.util.*;
       
    24   import com.nokia.tools.variant.content.confml.*;
       
    25 }
       
    26 
       
    27 @members {
       
    28   private View view;
       
    29 
       
    30   public void setView(View view) {
       
    31     this.view = view;
       
    32   }
       
    33   
       
    34   public View getView() {
       
    35     return view;
       
    36   }
       
    37 
       
    38   private SequenceItem sequenceItem;
       
    39   
       
    40   public SequenceItem getSequenceItem() {
       
    41     return sequenceItem;
       
    42   }
       
    43   
       
    44   public void setSequenceItem(SequenceItem si) {
       
    45     this.sequenceItem = si;
       
    46   }
       
    47   
       
    48   private Setting setting;
       
    49   
       
    50   public void setSetting(Setting setting) {
       
    51     this.setting = setting;
       
    52   }
       
    53   
       
    54   public Setting getSetting() {
       
    55     return setting;
       
    56   }
       
    57   
       
    58   
       
    59   private String featureRef;
       
    60   
       
    61   public void setFeatureRef(String featureRef) {
       
    62     this.featureRef = featureRef;
       
    63   }
       
    64   
       
    65   public String getFeatureRef() {
       
    66     return featureRef; 
       
    67   }
       
    68 }
       
    69 
       
    70 @lexer::header {
       
    71   package com.nokia.tools.variant.confml.expressions.settings;
       
    72 }
       
    73 
       
    74 // ##################### BASIC EXPRESSIONS
       
    75 expr returns [Set<Setting> settings]: 
       
    76   (e = orExpr NEWLINE             {
       
    77                                     settings = e;
       
    78                                   })*
       
    79 ;
       
    80 
       
    81 // ##################### BOOLEAN EXPRESSIONS
       
    82 orExpr returns [Set<Setting> settings]:
       
    83   e1 = andExpr                    {  
       
    84                                     settings = e1;
       
    85                                   }
       
    86   (
       
    87     'or'  e2 = andExpr            {
       
    88                                     settings.addAll(e2);
       
    89                                   }
       
    90   )*
       
    91 ;
       
    92 
       
    93 andExpr returns [Set<Setting> settings]:
       
    94   e1 = equalityExpr               {
       
    95                                     settings = e1;
       
    96                                   }
       
    97   (
       
    98     'and' e2 = equalityExpr       {
       
    99                                     settings.addAll(e2);
       
   100                                   }
       
   101   )*
       
   102 ;
       
   103 
       
   104 equalityExpr returns [Set<Setting> settings]: 
       
   105   e1 = relationalExpr             { 
       
   106                                     settings = e1;
       
   107                                   }
       
   108   (
       
   109     '='   e2 = relationalExpr     {
       
   110                                     settings.addAll(e2);
       
   111                                   }
       
   112   | '!='  e2 = relationalExpr     {
       
   113                                     settings.addAll(e2);
       
   114                                   }
       
   115   )*
       
   116 ;
       
   117 
       
   118 relationalExpr returns [Set<Setting> settings]:
       
   119   e1 = additiveExpr               { 
       
   120                                     settings = e1;
       
   121                                   }
       
   122   (
       
   123     '<'   e2 = additiveExpr       {
       
   124                                     settings.addAll(e2);
       
   125                                   }
       
   126                                            
       
   127   | '>'   e2 = additiveExpr       {
       
   128                                     settings.addAll(e2);
       
   129                                   }
       
   130                                            
       
   131   | '<='  e2 = additiveExpr       {
       
   132                                     settings.addAll(e2);
       
   133                                   }
       
   134                                            
       
   135   | '>='  e2 = additiveExpr       {
       
   136                                     settings.addAll(e2);
       
   137                                   }
       
   138   )*
       
   139 ;
       
   140   
       
   141 // ################# Numeric Expressions
       
   142 additiveExpr returns [Set<Setting> settings] : 
       
   143 	e1 = multiplicativeExpr         {
       
   144 	                                  settings = e1;
       
   145 	                                }
       
   146 	(
       
   147 	  '+'   e2 = multiplicativeExpr {
       
   148 	                                  settings.addAll(e2);
       
   149 	                                } 
       
   150     | '-' e2 = multiplicativeExpr {
       
   151                                     settings.addAll(e2);
       
   152                                   } 
       
   153 	)*
       
   154 ;
       
   155 
       
   156 multiplicativeExpr returns [Set<Setting> settings]: 
       
   157 	e1 = unaryExpr                  {
       
   158 			                              settings = new HashSet<Setting>();
       
   159 			                              settings.add(e1);	
       
   160 	                                }
       
   161 	(
       
   162 	  '*'   e2 = unaryExpr          {
       
   163 			                              settings.add(e2);
       
   164 	                                }
       
   165 	| 'div' e2 = unaryExpr          {
       
   166 			                              settings.add(e2);
       
   167 			                            }
       
   168 	| 'mod' e2 = unaryExpr          {
       
   169 			                              settings.add(e2);
       
   170 			                            }
       
   171 	)* 
       
   172 ;
       
   173 
       
   174 unaryExpr returns [Setting setting]: 
       
   175   e1 = primaryExpr                {
       
   176                                     setting = e1;
       
   177                                   }
       
   178   | '-' e2 = primaryExpr          {
       
   179                                     setting = e2;
       
   180                                   }
       
   181 ;
       
   182 
       
   183 primaryExpr returns [Setting setting]: 
       
   184   e1 = settingRef                 { 
       
   185                                     setting = e1;
       
   186                                   }
       
   187   | '(' orExpr ')'                { }
       
   188   | Literal                       { }
       
   189   | Number                        { }
       
   190 ;
       
   191 
       
   192 // ################# Expression Lexical Structure
       
   193 
       
   194 settingRef returns [Setting setting]: 
       
   195   '.'                             {
       
   196                                     setting = getSetting();
       
   197                                   }
       
   198   | r = Ref                       {
       
   199                                     Setting s = getSetting();
       
   200 	                                  String currentFeatureRef = getFeatureRef();
       
   201 	                                  
       
   202 	                                  EList<Setting> allSettings = view.getSharedSettingInstances();
       
   203 	                                  if (s != null) {// Context is Setting
       
   204 	                                   String absRef = s.getAbsRef();
       
   205 	                                   String[] refs = absRef.split("/");
       
   206 	                                   if (refs.length == 2) {// simple setting context
       
   207 	                                    String featureRef = absRef.substring(0, absRef.indexOf('/'));
       
   208 	                                    String searchSettingAbsRef = featureRef + "/" + r.getText();
       
   209 	                                    for (int i = 0 ; i < allSettings.size() ; i++) {
       
   210 	                                      Setting si = allSettings.get(i);
       
   211 	                                      if (si.getAbsRef().equals(searchSettingAbsRef)) {
       
   212 	                                        setting = si;
       
   213 	                                        break;
       
   214 	                                      }
       
   215 	                                    }
       
   216 	                                   } else {// subsetting context
       
   217 	                                     SequenceItem si = getSequenceItem();
       
   218 	                                     EList<Setting> subsettings = si.getSetting();
       
   219 	                                     for (int i = 0 ; i < subsettings.size() ; i++) {
       
   220 	                                       Setting ss = subsettings.get(i);
       
   221 	                                       if (ss.getSettingRef().equals(r.getText())) {
       
   222 	                                           setting = ss;
       
   223 	       	                                  break;
       
   224 	        	                                }
       
   225 	                                     }	                                                  
       
   226 	                                   }
       
   227 	                                  } else if (currentFeatureRef != null) {
       
   228 	                                    String searchedSettingAbsRef = currentFeatureRef + "/" + r.getText();
       
   229 	                                    for (int i = 0 ; i < allSettings.size() ; i++) {
       
   230 	                                      Setting si = allSettings.get(i);
       
   231 	                                      if (si.getAbsRef().equals(searchedSettingAbsRef)) {
       
   232 	                                        setting = si;
       
   233 	                                        break;
       
   234 	                                      }
       
   235 	                                    }
       
   236 	                                  }
       
   237                                   }
       
   238   | (r1 = Ref '/' r2 = Ref)       {
       
   239 	                                  String absRef = r1.getText() + "/" + r2.getText();
       
   240 	                                  EList<Setting> settings = view.getSharedSettingInstances();
       
   241 	                                  Setting s = null;
       
   242 	                                  for (int i = 0 ; i < settings.size() ; i++) {
       
   243 	                                    Setting x = settings.get(i);
       
   244 	                                    if (x.getAbsRef().equals(absRef)) {
       
   245 	                                      s = x;
       
   246 	                                      break;
       
   247 	                                    }                                                
       
   248 	                                  }                                               
       
   249 	                                  setting = s;
       
   250                                   }
       
   251   | (r1 = Ref '/' rx = Ref '[' n = Number ']' '/' rs = Ref)
       
   252                                   {
       
   253                                     int index = Integer.parseInt(n.getText());
       
   254                                     String absRef = r1.getText() + "/" + rx.getText();
       
   255                                     EList<Setting> settings = view.getSharedSettingInstances();
       
   256                                     Setting s = null;
       
   257                                     for (int i = 0 ; i < settings.size() ; i++) {
       
   258                                       Setting x = settings.get(i);
       
   259                                       if (x.getAbsRef().equals(absRef)) {
       
   260                                         s = x;
       
   261                                         break;
       
   262                                       }                                                
       
   263                                     }                                               
       
   264                                     if (s instanceof SequenceSetting) {
       
   265                                       SequenceSetting ss = (SequenceSetting) s;
       
   266                                       String subSettingAbsRef = absRef + "/" + rs.getText();
       
   267                                       EList<SequenceItem> items = ss.getSequenceItem();
       
   268                                       if (index < items.size()) {
       
   269                                         SequenceItem si = items.get(index);
       
   270                                         EList<Setting> subsettings = si.getSetting();
       
   271                                         for (int i = 0 ; i < subsettings.size() ; i++) {
       
   272                                           Setting subSetting = subsettings.get(i);
       
   273                                           if (subSetting.getAbsRef().equals(subSettingAbsRef)) {
       
   274                                             setting = subSetting;
       
   275                                             break;
       
   276                                           }
       
   277                                         }
       
   278                                       }
       
   279                                     }
       
   280                                   }
       
   281   | r1 = Ref '/' r2 = Ref '/' r3 = Ref
       
   282                                   {
       
   283 	                                  String absRef = r1.getText() + "/" + r2.getText();
       
   284 	                                  EList<Setting> settings = view.getSharedSettingInstances();
       
   285 	                                  Setting s = null;
       
   286 	                                  for (int i = 0 ; i < settings.size() ; i++) {
       
   287 	                                    Setting x = settings.get(i);
       
   288 	                                    if (x.getAbsRef().equals(absRef)) {
       
   289 	                                      s = x;
       
   290 	                                      break;
       
   291 	                                    }                                                
       
   292 	                                  }
       
   293 	                                  String text = r3.getText();
       
   294 	                                  if (text.equals("localPath") || text.equals("targetPath")) {
       
   295 	                                    setting = s;
       
   296 	                                  }
       
   297                                   }
       
   298 ;
       
   299 
       
   300 Ref :        ('a'..'z' | 'A'..'Z' ) ('a'..'z' | 'A'..'Z' | '0'..'9' | '.' | '-' | '_')*
       
   301 ;
       
   302 
       
   303 Literal :
       
   304     '"' .* '"'
       
   305   | '\'' .* '\''
       
   306   | '&apos;' .* '&apos;'
       
   307   | '&quot;' .* '&quot;'
       
   308 ;
       
   309 
       
   310 Number : ('0'..'9')+ ('.' ('0'..'9')+)?
       
   311   | '.' ('0'..'9')+
       
   312 ;
       
   313 
       
   314 NEWLINE : '\r' ? '\n'
       
   315 ;
       
   316 
       
   317 WS : (' ' |'\t' |'\n' |'\r' )+ {skip();}
       
   318 ;