Changeset 50 in default


Ignore:
Timestamp:
12/01/10 16:02:05 (13 years ago)
Author:
zeiss
Message:
 
Location:
trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/validation
Files:
1 added
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/validation/EbnfJavaValidator.java

    r49 r50  
    22 
    33import java.util.ArrayList; 
     4import java.util.HashMap; 
     5import java.util.HashSet; 
     6import java.util.Iterator; 
    47import java.util.List; 
     8import java.util.Set; 
    59import java.util.Stack; 
    610 
     
    341345                if (!checkSubruleDuplicates) 
    342346                        return; 
    343  
     347                 
     348                HashMap<String, DuplicateEntry> dupesMap = new HashMap<String, DuplicateEntry>(); 
     349                Set<String> taggedEntries = new HashSet<String>(); 
     350                 
     351                // build dupes map 
    344352                for (int i=0; i < bnf.getBnfEntry().size(); i++) { 
    345353                        BnfEntry currentBnfEntry = bnf.getBnfEntry().get(i); 
     
    348356                                CompositeNode ruleParserNode = NodeUtil.getNodeAdapter(currentBnfEntry.getRule().getDefinitionList()).getParserNode(); 
    349357                                String ruleText = ruleParserNode.serialize().trim(); 
    350                                 ruleText = ruleText + " "; 
    351                                 String processedRuleText = ruleText.replaceAll("([^\"])\\(([^\"])", "$1 ( $2"); // ( case 1 
    352                                 processedRuleText = processedRuleText.replaceAll("\\(([^\"])", " ( $1"); // ( case 2 
    353                                 processedRuleText = processedRuleText.replaceAll("([^\"])\\(\"", "$1 ( \""); // ( case 3 
    354  
    355                                 processedRuleText = processedRuleText.replaceAll("([^\"])\\)([^\"])", "$1 ) $2"); // ) case 1 
    356                                 processedRuleText = processedRuleText.replaceAll("\\)([^\"])", " ) $1"); // ) case 2 
    357                                 processedRuleText = processedRuleText.replaceAll("\"\\)([^\"])", "\" ) $1"); // ) case 3 
    358                                  
    359                                 processedRuleText = processedRuleText.replaceAll("([^\"])\\{([^\"])", "$1 { $2"); // { case 1 
    360                                 processedRuleText = processedRuleText.replaceAll("\\{([^\"])", " { $1"); // { case 2 
    361                                 processedRuleText = processedRuleText.replaceAll("([^\"])\\{\"", "$1 { \""); // { case 3 
    362                                  
    363                                 processedRuleText = processedRuleText.replaceAll("([^\"])\\}([^\\+\"])", "$1 } $2"); // } case 1 
    364                                 processedRuleText = processedRuleText.replaceAll("\\}([^\\+\"])", " } $1"); // } case 2 
    365                                 processedRuleText = processedRuleText.replaceAll("\"\\}([^\\+\"])", "\" } $1"); // } case 3 
    366                                  
    367                                 processedRuleText = processedRuleText.replaceAll("([^\"])\\}\\+([^\"])", "$1 }\\+ $2"); // }+ case 1 
    368                                 processedRuleText = processedRuleText.replaceAll("\\}\\+([^\"])", " }\\+ $1 "); // }+ case 2 
    369                                 processedRuleText = processedRuleText.replaceAll("\"\\}\\+([^\"])", "\" }\\+ $1 "); // }+ case 3 
    370                                  
    371                                 processedRuleText = processedRuleText.replaceAll("([^\"])\\[([^\"])", "$1 [ $2"); // [ case 1 
    372                                 processedRuleText = processedRuleText.replaceAll("\\[([^\"])", " [ $1"); // [ case 2 
    373                                 processedRuleText = processedRuleText.replaceAll("([^\"])\\[\"", "$1 [ \""); // [ case 3 
    374  
    375                                 processedRuleText = processedRuleText.replaceAll("([^\"])\\]([^\"])", "$1 ] $2"); // ] case 1 
    376                                 processedRuleText = processedRuleText.replaceAll("\\]([^\"])", " ] $1"); // ] case 2 
    377                                 processedRuleText = processedRuleText.replaceAll("\"\\]([^\"])", "\" ] $1"); // ] case 3 
    378  
     358                                String processedRuleText = textSpacer(ruleText); 
    379359                                 
    380360                                String trimmedRuleText = processedRuleText.replaceAll("[\t\n\r]", " ").replaceAll("[ ]+", " "); 
    381                                 System.out.println("rule: " + trimmedRuleText); 
    382361                                 
    383 //                              System.out.println(trimmedRuleText); 
    384362                                String[] parts = trimmedRuleText.split(" "); 
    385363                                 
     
    388366                                                if (isBalancedPairs(parts, j, k) && (k-j > 1)) { 
    389367                                                        String balancedSubString = createString(parts, j, k); 
    390                                                         System.out.println(balancedSubString); 
     368                                                        DuplicateEntry mapEntry = dupesMap.get(balancedSubString); 
     369                                                        if (mapEntry == null) { 
     370                                                                mapEntry = new DuplicateEntry(); 
     371                                                                mapEntry.setSnippet(balancedSubString); 
     372                                                                mapEntry.addRule(currentBnfEntry.getRule()); 
     373                                                                dupesMap.put(balancedSubString, mapEntry); 
     374                                                        } else { 
     375                                                                mapEntry.addRule(currentBnfEntry.getRule()); 
     376                                                                dupesMap.put(balancedSubString, mapEntry); 
     377                                                                taggedEntries.add(balancedSubString); 
     378                                                        } 
    391379                                                } 
    392  
    393 //                                              combined.append(parts[k]); 
    394 //                                              combined.append(" "); 
    395380                                        } 
    396381                                } 
     382                        } 
     383                } 
     384                 
     385                // create warnings 
     386                 
     387                Iterator<String> it = taggedEntries.iterator(); 
     388                 
     389                while (it.hasNext()) { 
     390                        String entry = it.next(); 
     391                        DuplicateEntry dupeEntry = dupesMap.get(entry); 
     392                        if (dupeEntry.getRules().size() < 2) 
     393                                continue; 
     394                         
     395                        String warningText = ""; 
     396                        warningText += entry + " is duplicated in the following rules: "; 
     397                        for (int i=0; i < dupeEntry.getRules().size(); i++) { 
     398                                Rule rule = dupeEntry.getRules().get(i); 
     399                                CompositeNode parserNode = NodeUtil.getNodeAdapter(rule).getParserNode(); 
     400 
     401                                if (rule.getRulenumber() > 0) { 
     402                                        String ruleNumber = Integer.toString(rule.getRulenumber()).replaceAll("[ \t\n\r]", "");  
     403                                        warningText += ruleNumber; 
     404                                } 
     405                                warningText += " (Line "; 
     406                                warningText += parserNode.getLine(); 
     407                                warningText += ")"; 
    397408                                 
    398                                 System.out.println("---------------------------------------------"); 
    399  
    400                                  
    401                                  
    402                                  
    403                         } 
    404                 } 
    405                  
    406                  
    407                  
    408                  
    409 //              System.out.println("rule name: " + rule.getName()); 
    410 //              for (int i=0; i < definitionLists.size(); i++) { 
    411 //                      DefinitionList currentDefList = definitionLists.get(i); 
    412 //                       
    413 //                      CompositeNode currentRuleDefinitionList = NodeUtil.getNodeAdapter(currentDefList).getParserNode(); 
    414 //                      String currentRuleDefinitionListText = currentRuleDefinitionList.serialize().trim(); 
    415 //                      String trimmedCurrentRuleDefinitionListText = currentRuleDefinitionListText.replaceAll("[ \t\n\r]", ""); 
    416 //                      System.out.println(trimmedCurrentRuleDefinitionListText); 
    417 ////                    System.out.println("  -> " + currentRuleDefinitionListText); 
    418 // 
    419 //                       
    420 //              } 
    421                  
     409                                if (i+1 < dupeEntry.getRules().size()) 
     410                                        warningText += ", "; 
     411 
     412                        } 
     413 
     414                        for (int i=0; i < dupeEntry.getRules().size(); i++) { 
     415                                Rule rule = dupeEntry.getRules().get(i); 
     416                                CompositeNode parserNode = NodeUtil.getNodeAdapter(rule).getParserNode(); 
     417                                warning(warningText, parserNode.getElement(), 1); 
     418                        } 
     419                } 
     420                 
     421        } 
     422 
     423        private String textSpacer(String ruleText) { 
     424                ruleText = ruleText + " "; 
     425                String processedRuleText = ruleText.replaceAll("([^\"])\\(([^\"])", "$1 ( $2"); // ( case 1 
     426                processedRuleText = processedRuleText.replaceAll("\\(([^\"])", " ( $1"); // ( case 2 
     427                processedRuleText = processedRuleText.replaceAll("([^\"])\\(\"", "$1 ( \""); // ( case 3 
     428 
     429                processedRuleText = processedRuleText.replaceAll("([^\"])\\)([^\"])", "$1 ) $2"); // ) case 1 
     430                processedRuleText = processedRuleText.replaceAll("\\)([^\"])", " ) $1"); // ) case 2 
     431                processedRuleText = processedRuleText.replaceAll("\"\\)([^\"])", "\" ) $1"); // ) case 3 
     432                 
     433                processedRuleText = processedRuleText.replaceAll("([^\"])\\{([^\"])", "$1 { $2"); // { case 1 
     434                processedRuleText = processedRuleText.replaceAll("\\{([^\"])", " { $1"); // { case 2 
     435                processedRuleText = processedRuleText.replaceAll("([^\"])\\{\"", "$1 { \""); // { case 3 
     436                 
     437                processedRuleText = processedRuleText.replaceAll("([^\"])\\}([^\\+\"])", "$1 } $2"); // } case 1 
     438                processedRuleText = processedRuleText.replaceAll("\\}([^\\+\"])", " } $1"); // } case 2 
     439                processedRuleText = processedRuleText.replaceAll("\"\\}([^\\+\"])", "\" } $1"); // } case 3 
     440                 
     441                processedRuleText = processedRuleText.replaceAll("([^\"])\\}\\+([^\"])", "$1 }\\+ $2"); // }+ case 1 
     442                processedRuleText = processedRuleText.replaceAll("\\}\\+([^\"])", " }\\+ $1 "); // }+ case 2 
     443                processedRuleText = processedRuleText.replaceAll("\"\\}\\+([^\"])", "\" }\\+ $1 "); // }+ case 3 
     444                 
     445                processedRuleText = processedRuleText.replaceAll("([^\"])\\[([^\"])", "$1 [ $2"); // [ case 1 
     446                processedRuleText = processedRuleText.replaceAll("\\[([^\"])", " [ $1"); // [ case 2 
     447                processedRuleText = processedRuleText.replaceAll("([^\"])\\[\"", "$1 [ \""); // [ case 3 
     448 
     449                processedRuleText = processedRuleText.replaceAll("([^\"])\\]([^\"])", "$1 ] $2"); // ] case 1 
     450                processedRuleText = processedRuleText.replaceAll("\\]([^\"])", " ] $1"); // ] case 2 
     451                processedRuleText = processedRuleText.replaceAll("\"\\]([^\"])", "\" ] $1"); // ] case 3 
     452                return processedRuleText; 
    422453        } 
    423454         
Note: See TracChangeset for help on using the changeset viewer.