Changeset 3113 for proto/RE


Ignore:
Timestamp:
May 6, 2013, 7:59:24 AM (6 years ago)
Author:
bhull
Message:

Grammar-related changes

Location:
proto/RE
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • proto/RE/output/ccinput

    r3076 r3113  
     1lex.cc1 = [\x74]
    12lex.cc2 = [\x61]
    2 lex.cc4 = [\x6E]
    3 lex.cc3 = [\x69]
    4 lex.cc0 = [\x54]
    5 lex.cc1 = [\x77]
     3lex.cc0 = [\x00-\x09\x0B-\xFF]
     4lex.cc3 = [\x73]
     5lex.cc4 = [\x64]
    66lex.LF = [\x0A]
    77
  • proto/RE/output/re_debug.py

    r3076 r3113  
    4949        lgth = len(u8data)
    5050        m0=0
     51        m1=0
     52        m2=0
    5153        m0=~0
     54        m0 = (m0 & ~bitutil.Advance(lex.cc0))
    5255        m0 = bitutil.Advance((m0 & lex.cc0))
    53         m0 = bitutil.Advance((m0 & lex.cc1))
     56        m1 = m0
     57        m1 = bitutil.Advance((m1 & lex.cc1))
     58        m1 = bitutil.Advance((m1 & lex.cc1))
     59        m1 = bitutil.Advance((m1 & lex.cc1))
     60        m0 = m1
     61        m1 = m0
     62        m1 = bitutil.Advance((m1 & lex.cc1))
     63        m0 = (m0 | m1)
     64        m1 = bitutil.Advance((m1 & lex.cc1))
     65        m0 = (m0 | m1)
     66        m1 = bitutil.Advance((m1 & lex.cc1))
     67        m0 = (m0 | m1)
     68        m1 = bitutil.Advance((m1 & lex.cc1))
     69        m0 = (m0 | m1)
     70        m1 = bitutil.Advance((m1 & lex.cc1))
     71        m0 = (m0 | m1)
     72        m1 = bitutil.Advance((m1 & lex.cc1))
     73        m0 = (m0 | m1)
     74        m1 = bitutil.Advance((m1 & lex.cc1))
     75        m0 = (m0 | m1)
     76        m1 = bitutil.Advance((m1 & lex.cc1))
     77        m0 = (m0 | m1)
     78        m1 = bitutil.Advance((m1 & lex.cc1))
     79        m0 = (m0 | m1)
     80        m1 = bitutil.Advance((m1 & lex.cc1))
     81        m0 = (m0 | m1)
    5482        m0 = bitutil.Advance((m0 & lex.cc2))
    5583        m0 = bitutil.Advance((m0 & lex.cc3))
     
    6189        ('      lex.cc3', bitutil.bitstream2string(lex.cc3, lgth+1)),
    6290        ('      lex.cc4', bitutil.bitstream2string(lex.cc4, lgth+1)),
    63         ('      m0', bitutil.bitstream2string(m0, lgth+1))])
     91        ('      m0', bitutil.bitstream2string(m0, lgth+1)),
     92        ('      m1', bitutil.bitstream2string(m1, lgth+1)),
     93        ('      m2', bitutil.bitstream2string(m2, lgth+1))])
    6494        return
    6595
  • proto/RE/output/re_pablo.py

    r3076 r3113  
    4646def Demo(lex, output):
    4747        m0=0
     48        m1=0
     49        m2=0
    4850        m0=~0
     51        m0 = (m0 & ~pablo.Advance(lex.cc0))
    4952        m0 = pablo.Advance((m0 & lex.cc0))
    50         m0 = pablo.Advance((m0 & lex.cc1))
     53        m1 = m0
     54        m1 = pablo.Advance((m1 & lex.cc1))
     55        m1 = pablo.Advance((m1 & lex.cc1))
     56        m1 = pablo.Advance((m1 & lex.cc1))
     57        m0 = m1
     58        m1 = m0
     59        m1 = pablo.Advance((m1 & lex.cc1))
     60        m0 = (m0 | m1)
     61        m1 = pablo.Advance((m1 & lex.cc1))
     62        m0 = (m0 | m1)
     63        m1 = pablo.Advance((m1 & lex.cc1))
     64        m0 = (m0 | m1)
     65        m1 = pablo.Advance((m1 & lex.cc1))
     66        m0 = (m0 | m1)
     67        m1 = pablo.Advance((m1 & lex.cc1))
     68        m0 = (m0 | m1)
     69        m1 = pablo.Advance((m1 & lex.cc1))
     70        m0 = (m0 | m1)
     71        m1 = pablo.Advance((m1 & lex.cc1))
     72        m0 = (m0 | m1)
     73        m1 = pablo.Advance((m1 & lex.cc1))
     74        m0 = (m0 | m1)
     75        m1 = pablo.Advance((m1 & lex.cc1))
     76        m0 = (m0 | m1)
     77        m1 = pablo.Advance((m1 & lex.cc1))
     78        m0 = (m0 | m1)
    5179        m0 = pablo.Advance((m0 & lex.cc2))
    5280        m0 = pablo.Advance((m0 & lex.cc3))
  • proto/RE/src/codeGenerator/CodeGenerator.java

    r3015 r3113  
    88import ast.ConcatenationNode;
    99import ast.RepetitionNode;
     10import ast.SosNode;
     11import ast.EosNode;
     12
    1013import tokens.LextantToken;
    1114
    1215public class CodeGenerator {
     16
     17
     18    private String getAttributeValue(ASTNode node, String attribute) {
     19                //TODO: probably move this somewhere else
     20        //TODO: how are multiple attributes split? assuming that it's with "," for now
     21        String[] attributePairs = node.attributeString().split(",");
     22        for (int i = 0;i< attributePairs.length;i++) {
     23                String[] equalSplit = attributePairs[i].split("=");
     24                if (equalSplit.length==2) {
     25                       
     26                        if (equalSplit[0].trim().equals(attribute.trim()))
     27                        {
     28                                return equalSplit[1].trim();
     29                        }
     30                }
     31               
     32        }
     33        return "";
     34    }
     35
     36
    1337        public CodeGenerator(Map<ASTNode, NodeState> nodeStates,
    1438                        Map<String, String> characterClassVariables,
     
    3054        private Output genCode(RepetitionNode node) {
    3155       
     56
    3257                //only one child?
    3358                ASTNode child = node.child(0);
     59                ASTNode repetitionIndicator = node.child(1);
     60                int lB = Integer.parseInt(getAttributeValue(repetitionIndicator, "lowerBound"));
     61                int uB = Integer.parseInt(getAttributeValue(repetitionIndicator, "upperBound"));
     62
     63
     64
    3465                Output body = genCode(child);
    3566        NodeState nodeState = nodeStates.get(node);
     
    3869        LextantToken lT = (LextantToken) node.getToken();
    3970                String repetitionType = lT.getLextant().getPrimaryLexeme();
    40                
     71
    4172                Output cursorAssign = oG.makeAssignment(oG.makeVariable(childState.getCursorVariable()), oG.makeVariable(nodeState.getCursorVariable()));
    4273                Output out = null;
    4374               
    44                 //TODO: better solution for alternate strategies
    45 
    46                 if (childState.isCharacterClass() && (repetitionType.equals("*")||repetitionType.equals("+"))) {
    47                         //is this the fastest way to do this?                   
    48                         if (repetitionType.equals("*")) {
    49                                 //Output add = oG.makeAdd(oG.makeAnd(oG.makeVariable(nodeState.getCursorVariable()),oG.makeVariable(characterClassVariables.get(childState.getCharacterClassRepresentationString()))), oG.makeVariable(characterClassVariables.get(childState.getCharacterClassRepresentationString())));
    50                                 //Output xOr = oG.makeXOr(add, oG.makeVariable(characterClassVariables.get(childState.getCharacterClassRepresentationString())));
    51                                 //Output or = oG.makeOr(xOr, oG.makeVariable(nodeState.getCursorVariable()));
    52 
    53 
    54 
    55                                 Output matchStar = oG.makeMatchStar(oG.makeVariable(nodeState.getCursorVariable()), oG.makeVariable(characterClassVariables.get(childState.getCharacterClassRepresentationString())));
    56                                 out = oG.makeAssignment(oG.makeVariable(nodeState.getCursorVariable()), matchStar);
    57                         }
    58                         if (repetitionType.equals("+")) {
    59                                 out = oG.combineStatements(cursorAssign, body);
     75
     76
     77
     78
     79
     80
     81
     82
     83                //LOWER BOUND
     84                if (lB>0) {
     85                        boolean lHandled=false;
     86
     87
     88                        //Default
     89                        if (lHandled==false) {
     90                                int i = 0;
     91                                out = cursorAssign;
     92                                while (i<lB) {
     93                                        out=oG.combineStatements(out,body);
     94                                        i+=1;
     95                                }
    6096                                out = oG.combineStatements(out, oG.makeAssignment(oG.makeVariable(nodeState.getCursorVariable()), oG.makeVariable(childState.getCursorVariable())));
    61                                
    62                                 Output matchStar = oG.makeMatchStar(oG.makeVariable(nodeState.getCursorVariable()), oG.makeVariable(characterClassVariables.get(childState.getCharacterClassRepresentationString())));
    63                                                                
    64                                 //Output add = oG.makeAdd(oG.makeAnd(oG.makeVariable(nodeState.getCursorVariable()),oG.makeVariable(characterClassVariables.get(childState.getCharacterClassRepresentationString()))), oG.makeVariable(characterClassVariables.get(childState.getCharacterClassRepresentationString())));
    65                                 //Output xOr = oG.makeXOr(add, oG.makeVariable(characterClassVariables.get(childState.getCharacterClassRepresentationString())));
    66                                 //Output or = oG.makeOr(xOr, oG.makeVariable(nodeState.getCursorVariable()));
    67                                 out = oG.combineStatements(out,oG.makeAssignment(oG.makeVariable(nodeState.getCursorVariable()), matchStar));
    68                         }
    69                        
    70                 } else {
    71                
    72                         //too many assignments.  is the compiler going to do this reasonably well?  fix is messy
    73                         if (repetitionType.equals("?")) {
    74                                 out = oG.combineStatements(cursorAssign, body);
    75                                 out = oG.combineStatements(out, oG.makeAssignment(oG.makeVariable(nodeState.getCursorVariable()),oG.makeOr(oG.makeVariable(nodeState.getCursorVariable()), oG.makeVariable(childState.getCursorVariable()))));
    76                        
    77                         }
    78                         if (repetitionType.equals("*")) {
    79                                 out = oG.combineStatements(cursorAssign, body);
    80                                 out = oG.combineStatements(out, oG.makeWhile(oG.makeAnd(oG.makeNot(oG.makeVariable(nodeState.getCursorVariable())),oG.makeVariable(childState.getCursorVariable())), oG.combineStatements(oG.makeAssignment(oG.makeVariable(nodeState.getCursorVariable()), oG.makeOr(oG.makeVariable(nodeState.getCursorVariable()), oG.makeVariable(childState.getCursorVariable()))),body)));
    81                        
    82                         }
    83                         if (repetitionType.equals("+")) {
    84                
    85                                 out = oG.combineStatements(cursorAssign, body);
    86                                 out = oG.combineStatements(out, oG.makeAssignment(oG.makeVariable(nodeState.getCursorVariable()), oG.makeVariable(childState.getCursorVariable())));
    87                                 out = oG.combineStatements(out, body);
    88                                 out = oG.combineStatements(out, oG.makeWhile(oG.makeAnd(oG.makeNot(oG.makeVariable(nodeState.getCursorVariable())),oG.makeVariable(childState.getCursorVariable())), oG.combineStatements(oG.makeAssignment(oG.makeVariable(nodeState.getCursorVariable()), oG.makeOr(oG.makeVariable(nodeState.getCursorVariable()), oG.makeVariable(childState.getCursorVariable()))),body)));
    89                         }
    90                 }
     97                                lHandled=true;
     98                        }
     99
     100                }
     101
     102
     103               
     104
     105                //UPPER BOUND
     106                if ((uB>lB) || (uB==-1)) {
     107                        boolean uHandled=false;
     108                        if (childState.isCharacterClass()) {
     109                                if (uB==-1&&uHandled==false) {
     110                                        Output matchStar = oG.makeMatchStar(oG.makeVariable(nodeState.getCursorVariable()), oG.makeVariable(characterClassVariables.get(childState.getCharacterClassRepresentationString())));
     111                                        out = oG.combineStatements(out,oG.makeAssignment(oG.makeVariable(nodeState.getCursorVariable()), matchStar));
     112                                        uHandled=true;
     113                                }
     114
     115                        }
     116
     117                        //Default
     118                        if (uHandled==false) {
     119                                if (uB>0) {
     120                                        int i = lB;
     121                                        out = oG.combineStatements(out,cursorAssign);
     122                                        while (i<uB) {
     123                                                out = oG.combineStatements(out, body);
     124                                                out = oG.combineStatements(out, oG.makeAssignment(oG.makeVariable(nodeState.getCursorVariable()), oG.makeOr(oG.makeVariable(nodeState.getCursorVariable()), oG.makeVariable(childState.getCursorVariable()))));
     125                                                i+=1;
     126                                        }
     127                                } else {
     128                                        out = oG.combineStatements(out, cursorAssign);
     129                                        out = oG.combineStatements(out, body);
     130                                        out = oG.combineStatements(out, oG.makeWhile(oG.makeAnd(oG.makeNot(oG.makeVariable(nodeState.getCursorVariable())),oG.makeVariable(childState.getCursorVariable())), oG.combineStatements(oG.makeAssignment(oG.makeVariable(nodeState.getCursorVariable()), oG.makeOr(oG.makeVariable(nodeState.getCursorVariable()), oG.makeVariable(childState.getCursorVariable()))),body)));
     131                                }
     132                                uHandled=true;
     133                                       
     134
     135                        }
     136
     137                }
     138               
    91139                return out;
    92140    }
     
    112160        }
    113161        private Output genCode(ConcatenationNode node) {
     162                //Simple and temporary if insertion
     163                int j = 0;
     164                int count = 0;
     165                int period = 4;
     166                while (j<node.getChildren().size()) {
     167                        ASTNode child = node.getChildren().get(j);
     168                        NodeState childState = nodeStates.get(child);
     169                        if (allowIf(child)) {
     170                                count+=1;
     171                                if (count==period) {
     172                                        count=0;
     173                                        if ((node.getChildren().size()-j)>=period) {
     174                                                childState.setInsertIf(true);
     175                                        }
     176                                }
     177                        }
     178                        j+=1;
     179                }               
    114180                Output out = null;
    115                 for (ASTNode child: node.getChildren()) {
    116                 out = oG.combineStatements(out, genCode(child));
    117         }
     181                int i = node.getChildren().size();
     182                NodeState nodeState = nodeStates.get(node);
     183                while (i>0){
     184                        i-=1;
     185                        ASTNode child = node.getChildren().get(i);
     186                        NodeState childState = nodeStates.get(child);
     187
     188                        if (childState.getInsertIf()) {
     189                                out = oG.makeIf(oG.makeAnd(getVariableIf(child),oG.makeVariable(nodeState.getCursorVariable())),oG.combineStatements(genCode(child),out));
     190                                out = oG.combineStatements(oG.makeAssignment(oG.makeVariable(nodeState.getCursorVariable()),oG.makeAnd(getVariableIf(child),oG.makeVariable(nodeState.getCursorVariable()))),out);
     191                        } else {
     192                                out = oG.combineStatements(genCode(child),out);
     193                        }
     194                }
    118195                return out;
    119         }
     196
     197        }
     198        private boolean allowIf(ASTNode node) {
     199                //Temporary
     200                NodeState nodeState = nodeStates.get(node);
     201                if (nodeState.isCharacterClass()) {
     202                        return true;
     203                }       
     204                else {
     205                        return false;
     206                }
     207        }
     208        private Output getVariableIf(ASTNode node) {
     209                //Temporary
     210                NodeState nodeState = nodeStates.get(node);
     211                if (nodeState.isCharacterClass()) {
     212                        return oG.makeVariable(characterClassVariables.get(nodeState.getCharacterClassRepresentationString()));
     213                }
     214                else {
     215                        return null;
     216                }
     217        }
     218
     219
     220
     221
     222
     223
     224
     225
     226
     227
     228
     229        private Output genCode(EosNode node) {
     230                NodeState nodeState = nodeStates.get(node);
     231                //Assuming file ends with new line
     232                return oG.makeAssignment(oG.makeVariable(nodeState.getCursorVariable()), oG.makeAnd(oG.makeVariable(nodeState.getCursorVariable()), oG.makeVariable(characterClassVariables.get(nodeState.getCharacterClassRepresentationString()))));
     233        }
     234        private Output genCode(SosNode node) {
     235                NodeState nodeState = nodeStates.get(node);
     236                return oG.makeAssignment(oG.makeVariable(nodeState.getCursorVariable()), oG.makeAnd(oG.makeVariable(nodeState.getCursorVariable()), oG.makeNot(oG.makeAdvance(oG.makeVariable(characterClassVariables.get(nodeState.getCharacterClassRepresentationString()))))));
     237
     238        }
     239
     240
     241
    120242        private Output genCode(ASTNode node) {
    121243                NodeState nodeState = nodeStates.get(node);
     
    132254                else if (node instanceof AlternationNode) {
    133255                        return genCode((AlternationNode)node);
     256                }
     257                else if (node instanceof SosNode) {
     258                        return genCode((SosNode)node);
     259                }
     260                else if (node instanceof EosNode) {
     261                        return genCode((EosNode)node);
    134262                }
    135263                Output out = null;
  • proto/RE/src/codeGenerator/NodeState.java

    r2331 r3113  
    1515        private boolean isCharacterClass;
    1616       
     17        private boolean insertIf;       
    1718
    1819        private Boolean[] characterClassRepresentation;
     
    5758        }
    5859       
    59        
     60        public void setInsertIf(boolean insertIf) {
     61                this.insertIf = insertIf;
     62        }
     63        public boolean getInsertIf() {
     64                return insertIf;
     65        }
     66               
     67
    6068}
  • proto/RE/src/codeGenerator/OutputGenerator.java

    r3015 r3113  
    1313        public Output makeAdd(Output op1, Output op2);
    1414        public Output makeMatchStar(Output op1, Output op2);
    15        
     15        public Output makeIf(Output condition, Output body);
    1616}
  • proto/RE/src/codeGenerator/PythonGenerator.java

    r3015 r3113  
    7979                return new PythonOutput(variable);
    8080        }
     81
     82
     83        @Override
     84        public Output makeIf(Output condition, Output body) {
     85                return indentBlock(new PythonOutput("if "+condition+":"+lineBreak+indentBlock(body)));
     86        }
    8187}
  • proto/RE/src/codeGenerator/Visitor.java

    r3072 r3113  
    77
    88import ast.ASTNode;
     9import ast.AnyNode;
    910import ast.AlternationNode;
    1011import ast.CharNode;
     
    1718import ast.ASTVisitor.Default;
    1819import ast.StartNode;
     20import ast.EosNode;
     21import ast.SosNode;
    1922
    2023public class Visitor extends Default<ASTNode> {
     
    130133        return defaultVisitLeave(node);
    131134    }
     135    public ASTNode visitLeave(AnyNode node, List<ASTNode> childresults) {
     136        NodeState currState = nodeStates.get(node);
     137        currState.setCharacterClass(true);
     138        currState.setCharacterClassRepresentation(generateCharacterClassRepresentation(node));
     139        return defaultVisitLeave(node);
     140    }
     141    public ASTNode visitLeave(EosNode node, List<ASTNode> childresults) {
     142        NodeState currState = nodeStates.get(node);
     143        currState.setCharacterClass(false);
     144        currState.setCharacterClassRepresentation(generateCharacterClassRepresentation(node));
     145        if (characterClassVariables.containsKey(currState.getCharacterClassRepresentationString())==false)
     146        {
     147                characterClassVariables.put(currState.getCharacterClassRepresentationString(), characterClassVariableGenerator.getNextCharacterClassVariable());                                       
     148        }
     149        return defaultVisitLeave(node);
     150    }
     151    public ASTNode visitLeave(SosNode node, List<ASTNode> childresults) {
     152        NodeState currState = nodeStates.get(node);
     153        currState.setCharacterClass(false);
     154        currState.setCharacterClassRepresentation(generateCharacterClassRepresentation(node));
     155        if (characterClassVariables.containsKey(currState.getCharacterClassRepresentationString())==false)
     156        {
     157                characterClassVariables.put(currState.getCharacterClassRepresentationString(), characterClassVariableGenerator.getNextCharacterClassVariable());                                       
     158        }
     159        return defaultVisitLeave(node);
     160    }
     161
    132162    public ASTNode visitLeave(RangeNode node, List<ASTNode> childresults) {
    133163        NodeState currState = nodeStates.get(node);
     
    181211        return result;
    182212    }
    183    
     213    private Boolean[] generateCharacterClassRepresentation(AnyNode node) {
     214        Boolean[] result = new Boolean[256];
     215
     216        Arrays.fill(result, true);
     217        result[10]=false;
     218       
     219        return result;
     220    }
     221    private Boolean[] generateCharacterClassRepresentation(EosNode node) {
     222        Boolean[] result = new Boolean[256];
     223
     224        Arrays.fill(result, false);
     225        result[10]=true;
     226       
     227        return result;
     228    }
     229    private Boolean[] generateCharacterClassRepresentation(SosNode node) {
     230        Boolean[] result = new Boolean[256];
     231
     232        Arrays.fill(result, true);
     233        result[10]=false;
     234       
     235        return result;
     236    }
     237
    184238    private Boolean[] mergeCharacterClassRepresentations(List<ASTNode> nodes) {
    185239        Boolean[] result = new Boolean[256];
Note: See TracChangeset for help on using the changeset viewer.