Show
Ignore:
Timestamp:
06/28/09 23:36:50 (15 months ago)
Author:
mb0 <mb0@…>
Children:
2aa064d78a2c1162da70e2413b7c386278a1473d
Parents:
1567fcce2711ee19e98902f8ef734f1a7dd9731f
git-author:
mb0 <mb0@…> (06/14/09 23:10:19)
git-committer:
mb0 <mb0@…> (06/28/09 23:36:50)
Message:

reworked lexer. lexer helper methods moved to as3 lex helper.
virtual semi insertion should now work reliable. the last lexer update was fubar. i forgot that the probe parser must be called for every token to work.
non-attribute soft keyword terminals are parsed more reliable.
the whole _abbrev and _full rule paths are not needed. we use simple semi insertion on '}' and EOF.
as alternate to _nosif there is now _sif. this change condenses the grammar and ast.
used copied lexer template that is not using deprecated methods.
regex and xml ast now have a common parent.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • org.axdt.as3.test/src/org/axdt/as3/imp/parser/BasicParserTest.java

    r82cecb8 rb32f7a4  
    11package org.axdt.as3.imp.parser; 
     2 
     3import java.util.ArrayList; 
    24 
    35import junit.framework.TestCase; 
     
    1012import org.axdt.as3.imp.parser.Ast.FunctionExpression; 
    1113import org.axdt.as3.imp.parser.Ast.IDirective; 
    12 import org.axdt.as3.imp.parser.Ast.ImportDirectiveList; 
     14import org.axdt.as3.imp.parser.Ast.ImportDirectives; 
    1315import org.axdt.as3.imp.parser.Ast.InterfaceDefinition; 
    1416import org.axdt.as3.imp.parser.Ast.Name; 
     
    1921 
    2022public class BasicParserTest extends TestCase { 
     23        private AS3Parser parser; 
    2124        private Program parse(String content) { 
    22                 return ParseUtil.parse(content); 
    23         } 
    24  
     25                parser = ParseUtil.parser(content); 
     26                return ParseUtil.parse(parser,0); 
     27        } 
     28        private <T extends IDirective> T assertFirstDirective(String string, Class<T> clazz) { 
     29                parser = ParseUtil.parser(string); 
     30                Program result = ParseUtil.parse(parser,0); 
     31                return assertFirstDirective(result, clazz); 
     32        } 
     33        @SuppressWarnings("unchecked") 
     34        private <T extends IDirective> T assertFirstDirective(Program prog, Class<T> clazz) { 
     35                IDirective directive = null; 
     36                if (prog != null) { 
     37                        directive = prog.getDirectives().getDirectiveAt(0); 
     38                } else { 
     39                        // TODO gather some info 
     40                        ArrayList tokens = parser.getIPrsStream().getTokens(); 
     41                        assertNotNull("parser error "+ tokens.toString(),prog); 
     42                } 
     43                assertNotNull(directive); 
     44                assertEquals(clazz, directive.getClass()); 
     45                return (T) directive; 
     46        } 
    2547        public void testPackage() throws Exception { 
    2648                Program prog; 
     
    5476                prog = parse("package P{} f();"); 
    5577                assertEquals(1, prog.getPackages().size()); 
    56                 assertEquals(1, prog.getDirectives().size()); 
     78                assertFirstDirective(prog,ExpressionStatement.class); 
    5779 
    5880                // bom works just as expected 
     
    6789                prog = parse("package P{} package Q{} function f(){}"); 
    6890                assertEquals(2, prog.getPackages().size()); 
    69                 assertEquals(1, prog.getDirectives().size()); 
     91                assertFirstDirective(prog,FunctionDefinition.class); 
    7092                 
    7193                System.out.print("expected"); 
     
    7597 
    7698        public void testNamespace() throws Exception { 
    77                 Program prog; 
    7899                NamespaceDefinition dir; 
    79100                 
    80                 prog = parse("namespace NS1"); 
    81                 assertEquals(true, prog.getDirectives().getDirectiveAt(0) instanceof NamespaceDefinition); 
    82                 dir = (NamespaceDefinition) prog.getDirectives().getDirectiveAt(0); 
     101                dir = assertFirstDirective("namespace NS1",NamespaceDefinition.class); 
    83102                assertEquals("NS1", dir.getName().toString()); 
    84103                 
    85                 prog = parse("namespace NS2 = NS1"); 
    86                 assertEquals(true, prog.getDirectives().getDirectiveAt(0) instanceof NamespaceDefinition); 
    87                 dir = (NamespaceDefinition) prog.getDirectives().getDirectiveAt(0); 
     104                dir = assertFirstDirective("namespace NS2 = NS1",NamespaceDefinition.class); 
    88105                assertEquals("NS2", dir.getName().toString()); 
    89106                assertEquals("NS1", dir.getAssignment().toString()); 
    90107                 
    91                 prog = parse("namespace NS3 = \"http://www.macromedia.com/flash/2005\""); 
    92                 assertEquals(true, prog.getDirectives().getDirectiveAt(0) instanceof NamespaceDefinition); 
    93                 dir = (NamespaceDefinition) prog.getDirectives().getDirectiveAt(0); 
     108                dir = assertFirstDirective("namespace NS3 = \"http://www.macromedia.com/flash/2005\"",NamespaceDefinition.class); 
    94109                assertEquals("NS3", dir.getName().toString()); 
    95110                assertEquals(StringLiteral.class, dir.getAssignment().getClass()); 
     
    98113 
    99114        public void testImport() throws Exception { 
    100                 Program prog; ImportDirectiveList list; 
    101                 prog = parse("import A;"); 
    102                 assertEquals(ImportDirectiveList.class, prog.getDirectives().getDirectiveAt(0).getClass()); 
    103                 prog = parse("import A; import a.b.C; import abc.*;"); 
    104                 list = (ImportDirectiveList) prog.getDirectives().getDirectiveAt(0); 
     115                ImportDirectives list; 
     116                list = assertFirstDirective("import A;",ImportDirectives.class); 
     117                assertEquals(1, list.size()); 
     118                list = assertFirstDirective("import A; import a.b.C; import abc.*;",ImportDirectives.class); 
    105119                assertEquals(3, list.size()); 
    106120                assertEquals("A", list.getImportDirectiveAt(0).getName().toString()); 
     
    112126 
    113127        public void testInterface() throws Exception { 
    114                 Program prog; InterfaceDefinition type; 
    115                  
    116                 prog = parse("interface A {}"); 
    117                 assertEquals(InterfaceDefinition.class, prog.getDirectives().getDirectiveAt(0).getClass()); 
    118                 type = (InterfaceDefinition) prog.getDirectives().getDirectiveAt(0); 
     128                InterfaceDefinition type; 
     129                 
     130                type = assertFirstDirective("interface A {}",InterfaceDefinition.class); 
    119131                assertEquals(Name.class, type.getName().getClass()); 
    120132                assertEquals(null, type.getBody().getDirectives()); 
    121133                 
    122                 prog = parse("interface a.b.C {}"); 
    123                 assertEquals(InterfaceDefinition.class, prog.getDirectives().getDirectiveAt(0).getClass()); 
    124                 type = (InterfaceDefinition) prog.getDirectives().getDirectiveAt(0); 
     134                type = assertFirstDirective("interface a.b.C {}",InterfaceDefinition.class); 
    125135                assertEquals(Name.class, type.getName().getClass()); 
    126136                assertEquals(null, type.getBody().getDirectives()); 
    127137                 
    128                 prog = parse("interface A { function f():A;function g():B;}"); 
    129                 assertEquals(InterfaceDefinition.class, prog.getDirectives().getDirectiveAt(0).getClass()); 
    130                 type = (InterfaceDefinition) prog.getDirectives().getDirectiveAt(0); 
     138                type = assertFirstDirective("interface A { function f():A;function g():B;}",InterfaceDefinition.class); 
    131139                assertEquals(2, type.getBody().getDirectives().size()); 
    132140                 
    133                 prog = parse("internal interface A {} public interface B{}"); 
    134                 assertEquals(AnnotatedDirective.class, prog.getDirectives().getDirectiveAt(0).getClass()); 
    135                 assertEquals(AnnotatedDirective.class, prog.getDirectives().getDirectiveAt(1).getClass()); 
     141                assertFirstDirective("internal interface A {}",AnnotatedDirective.class); 
     142                assertFirstDirective("public interface A {}",AnnotatedDirective.class); 
    136143        } 
    137144 
    138145        public void testVariable() throws Exception { 
    139                 Program prog; IDirective directive;  
    140                  
    141                 prog = parse("var a;"); 
    142                 directive = prog.getDirectives().getDirectiveAt(0); 
    143                 assertEquals(VariableDefinition.class, directive.getClass()); 
    144                  
    145                 assertEquals(AnnotatedDirective.class, parse("static var a;").getDirectives().getDirectiveAt(0).getClass()); 
    146                 assertEquals(AnnotatedDirective.class, parse("prototype var a;").getDirectives().getDirectiveAt(0).getClass()); 
    147                 assertEquals(AnnotatedDirective.class, parse("private var a;").getDirectives().getDirectiveAt(0).getClass()); 
    148                 assertEquals(AnnotatedDirective.class, parse("public var a;").getDirectives().getDirectiveAt(0).getClass()); 
    149                 assertEquals(AnnotatedDirective.class, parse("protected var a;").getDirectives().getDirectiveAt(0).getClass()); 
    150                 assertEquals(AnnotatedDirective.class, parse("internal var a;").getDirectives().getDirectiveAt(0).getClass()); 
     146                assertFirstDirective("var a;",VariableDefinition.class); 
     147                assertFirstDirective("static var a;",AnnotatedDirective.class); 
     148                assertFirstDirective("prototype var a;",AnnotatedDirective.class); 
     149                assertFirstDirective("private var a;",AnnotatedDirective.class); 
     150                assertFirstDirective("public var a;",AnnotatedDirective.class); 
     151                assertFirstDirective("protected var a;",AnnotatedDirective.class); 
     152                assertFirstDirective("internal var a;",AnnotatedDirective.class); 
    151153        } 
    152154         
    153155        public void testFunction() throws Exception { 
    154                 Program prog; IDirective directive; FunctionDefinition def; 
    155                 prog = parse("function f():void{}"); 
    156                 directive = prog.getDirectives().getDirectiveAt(0); 
    157                 assertEquals(FunctionDefinition.class, directive.getClass()); 
    158  
    159                 prog = parse("function f(b:B){a = b;a.c();}"); 
    160                 directive = prog.getDirectives().getDirectiveAt(0); 
    161                 def = (FunctionDefinition) directive; 
     156                IDirective directive; FunctionDefinition def; 
     157                def = assertFirstDirective("function f():void{}",FunctionDefinition.class); 
     158 
     159                def = assertFirstDirective("function f(b:B){a = b;a.c();}",FunctionDefinition.class); 
    162160                assertEquals("f", def.getName().toString()); 
    163161                assertEquals(2, def.getBlock().getDirectives().size()); 
     
    165163                assertEquals(null, common.getResultType()); 
    166164 
    167                 assertEquals(FunctionDefinition.class, parse("function f(){}").getDirectives().getDirectiveAt(0).getClass()); 
    168                 assertEquals(FunctionDefinition.class, parse("function f(...){}").getDirectives().getDirectiveAt(0).getClass()); 
    169                 assertEquals(FunctionDefinition.class, parse("function f(...b){}").getDirectives().getDirectiveAt(0).getClass()); 
    170                 assertEquals(FunctionDefinition.class, parse("function f(...b:B){}").getDirectives().getDirectiveAt(0).getClass()); 
    171                 assertEquals(FunctionDefinition.class, parse("function f(a:A,...b:B){}").getDirectives().getDirectiveAt(0).getClass()); 
    172                  
    173                 assertEquals(AnnotatedDirective.class, parse("static function a(){}").getDirectives().getDirectiveAt(0).getClass()); 
    174                 assertEquals(AnnotatedDirective.class, parse("override function a(){}").getDirectives().getDirectiveAt(0).getClass()); 
    175                 assertEquals(AnnotatedDirective.class, parse("final function a(){}").getDirectives().getDirectiveAt(0).getClass()); 
    176                 assertEquals(AnnotatedDirective.class, parse("private function a(){}").getDirectives().getDirectiveAt(0).getClass()); 
    177                 assertEquals(AnnotatedDirective.class, parse("public function a(){}").getDirectives().getDirectiveAt(0).getClass()); 
    178                 assertEquals(AnnotatedDirective.class, parse("protected function a(){}").getDirectives().getDirectiveAt(0).getClass()); 
    179                 assertEquals(AnnotatedDirective.class, parse("internal function a(){}").getDirectives().getDirectiveAt(0).getClass()); 
    180                 assertEquals(AnnotatedDirective.class, parse("prototype function a(){}").getDirectives().getDirectiveAt(0).getClass()); 
    181                 assertEquals(AnnotatedDirective.class, parse("native function a(){}").getDirectives().getDirectiveAt(0).getClass()); 
    182                  
    183                 prog = parse("function(b:B){a = b;};"); 
    184                 directive = prog.getDirectives().getDirectiveAt(0); 
    185                 assertEquals(ExpressionStatement.class, directive.getClass()); 
     165                def = assertFirstDirective("function f(){}",FunctionDefinition.class); 
     166                def = assertFirstDirective("function f(...){}",FunctionDefinition.class); 
     167                def = assertFirstDirective("function f(...b){}",FunctionDefinition.class); 
     168                def = assertFirstDirective("function f(...b:B){}",FunctionDefinition.class); 
     169                def = assertFirstDirective("function f(a:A,...b:B){}",FunctionDefinition.class); 
     170                def = assertFirstDirective("function get f(){}",FunctionDefinition.class); 
     171                def = assertFirstDirective("function get f(i){}",FunctionDefinition.class); 
     172                def = assertFirstDirective("function get f(a:A,b:B){}",FunctionDefinition.class); 
     173                // TODO fix parameter declaration 
     174                def = assertFirstDirective("function set(){}",FunctionDefinition.class); 
     175                def = assertFirstDirective("function get(a,b){}",FunctionDefinition.class); 
     176                def = assertFirstDirective("function get(a:A,b){}",FunctionDefinition.class); 
     177                def = assertFirstDirective("function get(a:A,b:*){}",FunctionDefinition.class); 
     178                def = assertFirstDirective("function get(a:A,b:*):C{}",FunctionDefinition.class); 
     179                def = assertFirstDirective("function get(){}",FunctionDefinition.class); 
     180                def = assertFirstDirective("function get(a:A){}",FunctionDefinition.class); 
     181                def = assertFirstDirective("function get(a:A,b:B,c:C):D {}",FunctionDefinition.class); 
     182                 
     183                assertFirstDirective("static function a(){}", AnnotatedDirective.class); 
     184                assertFirstDirective("override function a(){}", AnnotatedDirective.class); 
     185                assertFirstDirective("final function a(){}", AnnotatedDirective.class); 
     186                assertFirstDirective("private function a(){}", AnnotatedDirective.class); 
     187                assertFirstDirective("public function a(){}", AnnotatedDirective.class); 
     188                assertFirstDirective("protected function a(){}", AnnotatedDirective.class); 
     189                assertFirstDirective("internal function a(){}", AnnotatedDirective.class); 
     190                assertFirstDirective("prototype function a(){}", AnnotatedDirective.class); 
     191                assertFirstDirective("native function a(){}", AnnotatedDirective.class); 
     192 
     193                directive = assertFirstDirective("function(b:B){a = b;};", ExpressionStatement.class); 
    186194                assertEquals(FunctionExpression.class, ((ExpressionStatement)directive).getExpression().getClass()); 
    187195        } 
    188196 
    189197        public void testClass() throws Exception { 
    190                 Program prog; ClassDefinition def; 
    191                 prog = parse("class T{}"); 
    192                 assertEquals(ClassDefinition.class, prog.getDirectives().getDirectiveAt(0).getClass()); 
    193                 prog = parse("class T{function T(){}function S(){}}"); 
    194                 def = (ClassDefinition) prog.getDirectives().getDirectiveAt(0); 
     198                ClassDefinition def; 
     199                assertFirstDirective("class T{}", ClassDefinition.class); 
     200                def = assertFirstDirective("class T{function T(){}function S(){}}", ClassDefinition.class); 
    195201                assertEquals("T", def.getName().toString()); 
    196202                assertEquals(2, def.getBody().getDirectives().size()); 
     
    198204                assertEquals(FunctionDefinition.class, def.getBody().getDirectives().getDirectiveAt(1).getClass()); 
    199205                 
    200                 prog = parse("internal class A {} public class B{} final class C{} dynamic class D{}"); 
    201                 assertEquals(AnnotatedDirective.class, prog.getDirectives().getDirectiveAt(0).getClass()); 
    202                 assertEquals(AnnotatedDirective.class, prog.getDirectives().getDirectiveAt(1).getClass()); 
    203                 assertEquals(AnnotatedDirective.class, prog.getDirectives().getDirectiveAt(2).getClass()); 
    204                 assertEquals(AnnotatedDirective.class, prog.getDirectives().getDirectiveAt(3).getClass()); 
     206                assertFirstDirective("internal class A {}", AnnotatedDirective.class); 
     207                assertFirstDirective("public class A {}", AnnotatedDirective.class); 
     208                assertFirstDirective("dynamic class A {}", AnnotatedDirective.class); 
     209                assertFirstDirective("final class A {}", AnnotatedDirective.class); 
    205210        } 
    206211