forked from jasder/antlr
added unit tests for scope parser
[git-p4: depot-paths = "//depot/code/antlr4/main/": change = 6680]
This commit is contained in:
parent
6f2a5f3c57
commit
56a0940360
|
@ -19,20 +19,6 @@ import java.util.List;
|
|||
* use "int i" but ruby/python would use "i".
|
||||
*/
|
||||
public class ScopeParser {
|
||||
public static void main(String[] args) {
|
||||
System.out.println(parseTypeList("int i"));
|
||||
System.out.println(parseTypeList("int[] i, int j[]"));
|
||||
System.out.println(parseTypeList("Map<A\\,B>[] i, int j[]"));
|
||||
System.out.println(parseTypeList("int i = 34+a[3], int j[] = new int[34]"));
|
||||
System.out.println(parseTypeList("char *foo32[3] = {1\\,2\\,3}"));
|
||||
System.out.println();
|
||||
System.out.println(parseDynamicScope("int i;"));
|
||||
System.out.println(parseDynamicScope("int[] i; int j[];"));
|
||||
System.out.println(parseDynamicScope("Map<A,B>[] i; int j[];"));
|
||||
System.out.println(parseDynamicScope("int i = 34+a[3]; int j[] = new int[34];"));
|
||||
System.out.println(parseDynamicScope("char *foo32[] = {1,2,3};"));
|
||||
}
|
||||
|
||||
/** Given an arg or retval scope definition list like
|
||||
*
|
||||
* Map<String, String>, int[] j3, char *foo32[3]
|
||||
|
@ -67,7 +53,7 @@ public class ScopeParser {
|
|||
i++;
|
||||
}
|
||||
i++; // skip separator
|
||||
System.out.println("def="+buf.toString());
|
||||
// System.out.println("def="+buf.toString());
|
||||
Attribute a = parseAttributeDef(buf.toString());
|
||||
scope.attributes.put(a.name, a);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,383 @@
|
|||
package org.antlr.v4.test;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
/** */
|
||||
public class TestAttributes extends BaseTest {
|
||||
@Test public void testEscapedLessThanInAction() throws Exception {
|
||||
String action = "i<3; '<xmltag>'";
|
||||
}
|
||||
@Test public void testEscaped$InAction() throws Exception {
|
||||
String action = "int \\$n; \"\\$in string\\$\"";
|
||||
}
|
||||
@Test public void testArguments() throws Exception {
|
||||
String action = "$i; $i.x; $u; $u.x";
|
||||
}
|
||||
@Test public void testComplicatedArgParsing() throws Exception {
|
||||
String action = "x, (*a).foo(21,33), 3.2+1, '\\n', "+
|
||||
"\"a,oo\\nick\", {bl, \"fdkj\"eck}";
|
||||
}
|
||||
@Test public void testBracketArgParsing() throws Exception {
|
||||
}
|
||||
@Test public void testStringArgParsing() throws Exception {
|
||||
String action = "34, '{', \"it's<\", '\"', \"\\\"\", 19";
|
||||
}
|
||||
@Test public void testComplicatedSingleArgParsing() throws Exception {
|
||||
String action = "(*a).foo(21,33,\",\")";
|
||||
}
|
||||
@Test public void testArgWithLT() throws Exception {
|
||||
String action = "34<50";
|
||||
}
|
||||
@Test public void testGenericsAsArgumentDefinition() throws Exception {
|
||||
String action = "$foo.get(\"ick\");";
|
||||
}
|
||||
@Test public void testGenericsAsArgumentDefinition2() throws Exception {
|
||||
String action = "$foo.get(\"ick\"); x=3;";
|
||||
}
|
||||
@Test public void testGenericsAsReturnValue() throws Exception {
|
||||
}
|
||||
@Test public void testComplicatedArgParsingWithTranslation() throws Exception {
|
||||
String action = "x, $A.text+\"3242\", (*$A).foo(21,33), 3.2+1, '\\n', "+
|
||||
"\"a,oo\\nick\", {bl, \"fdkj\"eck}";
|
||||
}
|
||||
@Test public void testRefToReturnValueBeforeRefToPredefinedAttr() throws Exception {
|
||||
String action = "$x.foo";
|
||||
}
|
||||
@Test public void testRuleLabelBeforeRefToPredefinedAttr() throws Exception {
|
||||
String action = "$x.text";
|
||||
}
|
||||
@Test public void testInvalidArguments() throws Exception {
|
||||
String action = "$x";
|
||||
}
|
||||
@Test public void testReturnValue() throws Exception {
|
||||
String action = "$x.i";
|
||||
}
|
||||
@Test public void testReturnValueWithNumber() throws Exception {
|
||||
String action = "$x.i1";
|
||||
}
|
||||
@Test public void testReturnValues() throws Exception {
|
||||
String action = "$i; $i.x; $u; $u.x";
|
||||
}
|
||||
@Test public void testReturnWithMultipleRuleRefs() throws Exception {
|
||||
String action1 = "$obj = $rule2.obj;";
|
||||
String action2 = "$obj = $rule3.obj;";
|
||||
String expecting1 = "obj = rule21;";
|
||||
String expecting2 = "obj = rule32;";
|
||||
String action = action1;
|
||||
}
|
||||
@Test public void testInvalidReturnValues() throws Exception {
|
||||
String action = "$x";
|
||||
}
|
||||
@Test public void testTokenLabels() throws Exception {
|
||||
String action = "$id; $f; $id.text; $id.getText(); $id.dork " +
|
||||
"$id.type; $id.line; $id.pos; " +
|
||||
"$id.channel; $id.index;";
|
||||
}
|
||||
@Test public void testRuleLabels() throws Exception {
|
||||
String action = "$r.x; $r.start;\n $r.stop;\n $r.tree; $a.x; $a.stop;";
|
||||
}
|
||||
@Test public void testAmbiguRuleRef() throws Exception {
|
||||
}
|
||||
@Test public void testRuleLabelsWithSpecialToken() throws Exception {
|
||||
String action = "$r.x; $r.start; $r.stop; $r.tree; $a.x; $a.stop;";
|
||||
}
|
||||
@Test public void testForwardRefRuleLabels() throws Exception {
|
||||
String action = "$r.x; $r.start; $r.stop; $r.tree; $a.x; $a.tree;";
|
||||
}
|
||||
@Test public void testInvalidRuleLabelAccessesParameter() throws Exception {
|
||||
String action = "$r.z";
|
||||
}
|
||||
@Test public void testInvalidRuleLabelAccessesScopeAttribute() throws Exception {
|
||||
String action = "$r.n";
|
||||
}
|
||||
@Test public void testInvalidRuleAttribute() throws Exception {
|
||||
String action = "$r.blort";
|
||||
}
|
||||
@Test public void testMissingRuleAttribute() throws Exception {
|
||||
String action = "$r";
|
||||
}
|
||||
@Test public void testMissingUnlabeledRuleAttribute() throws Exception {
|
||||
String action = "$a";
|
||||
}
|
||||
@Test public void testNonDynamicAttributeOutsideRule() throws Exception {
|
||||
String action = "public void foo() { $x; }";
|
||||
}
|
||||
@Test public void testNonDynamicAttributeOutsideRule2() throws Exception {
|
||||
String action = "public void foo() { $x.y; }";
|
||||
}
|
||||
@Test public void testBasicGlobalScope() throws Exception {
|
||||
String action = "$Symbols::names.add($id.text);";
|
||||
}
|
||||
@Test public void testUnknownGlobalScope() throws Exception {
|
||||
String action = "$Symbols::names.add($id.text);";
|
||||
}
|
||||
@Test public void testIndexedGlobalScope() throws Exception {
|
||||
String action = "$Symbols[-1]::names.add($id.text);";
|
||||
}
|
||||
@Test public void test0IndexedGlobalScope() throws Exception {
|
||||
String action = "$Symbols[0]::names.add($id.text);";
|
||||
}
|
||||
@Test public void testAbsoluteIndexedGlobalScope() throws Exception {
|
||||
String action = "$Symbols[3]::names.add($id.text);";
|
||||
}
|
||||
@Test public void testScopeAndAttributeWithUnderscore() throws Exception {
|
||||
String action = "$foo_bar::a_b;";
|
||||
}
|
||||
@Test public void testSharedGlobalScope() throws Exception {
|
||||
String action = "$Symbols::x;";
|
||||
}
|
||||
@Test public void testGlobalScopeOutsideRule() throws Exception {
|
||||
String action = "public void foo() {$Symbols::names.add('foo');}";
|
||||
}
|
||||
@Test public void testRuleScopeOutsideRule() throws Exception {
|
||||
String action = "public void foo() {$a::name;}";
|
||||
}
|
||||
@Test public void testBasicRuleScope() throws Exception {
|
||||
String action = "$a::n;";
|
||||
}
|
||||
@Test public void testUnqualifiedRuleScopeAccessInsideRule() throws Exception {
|
||||
String action = "$n;";
|
||||
}
|
||||
@Test public void testIsolatedDynamicRuleScopeRef() throws Exception {
|
||||
String action = "$a;"; // refers to stack not top of stack
|
||||
}
|
||||
@Test public void testDynamicRuleScopeRefInSubrule() throws Exception {
|
||||
String action = "$a::n;";
|
||||
}
|
||||
@Test public void testIsolatedGlobalScopeRef() throws Exception {
|
||||
String action = "$Symbols;";
|
||||
}
|
||||
@Test public void testRuleScopeFromAnotherRule() throws Exception {
|
||||
String action = "$a::n;"; // must be qualified
|
||||
}
|
||||
@Test public void testFullyQualifiedRefToCurrentRuleParameter() throws Exception {
|
||||
String action = "$a.i;";
|
||||
}
|
||||
@Test public void testFullyQualifiedRefToCurrentRuleRetVal() throws Exception {
|
||||
String action = "$a.i;";
|
||||
}
|
||||
@Test public void testSetFullyQualifiedRefToCurrentRuleRetVal() throws Exception {
|
||||
String action = "$a.i = 1;";
|
||||
}
|
||||
@Test public void testIsolatedRefToCurrentRule() throws Exception {
|
||||
String action = "$a;";
|
||||
}
|
||||
@Test public void testIsolatedRefToRule() throws Exception {
|
||||
String action = "$x;";
|
||||
}
|
||||
@Test public void testFullyQualifiedRefToLabelInCurrentRule() throws Exception {
|
||||
String action = "$a.x;";
|
||||
}
|
||||
@Test public void testFullyQualifiedRefToListLabelInCurrentRule() throws Exception {
|
||||
String action = "$a.x;"; // must be qualified
|
||||
}
|
||||
@Test public void testFullyQualifiedRefToTemplateAttributeInCurrentRule() throws Exception {
|
||||
String action = "$a.st;"; // can be qualified
|
||||
}
|
||||
@Test public void testRuleRefWhenRuleHasScope() throws Exception {
|
||||
String action = "$b.start;";
|
||||
}
|
||||
@Test public void testDynamicScopeRefOkEvenThoughRuleRefExists() throws Exception {
|
||||
String action = "$b::n;";
|
||||
}
|
||||
@Test public void testRefToTemplateAttributeForCurrentRule() throws Exception {
|
||||
String action = "$st=null;";
|
||||
}
|
||||
@Test public void testRefToTextAttributeForCurrentRule() throws Exception {
|
||||
String action = "$text";
|
||||
}
|
||||
@Test public void testRefToStartAttributeForCurrentRule() throws Exception {
|
||||
String action = "$start;";
|
||||
}
|
||||
|
||||
@Test public void testTokenLabelFromMultipleAlts() throws Exception {
|
||||
String action = "$ID.text;"; // must be qualified
|
||||
}
|
||||
@Test public void testRuleLabelFromMultipleAlts() throws Exception {
|
||||
String action = "$b.text;"; // must be qualified
|
||||
}
|
||||
@Test public void testUnknownDynamicAttribute() throws Exception {
|
||||
String action = "$a::x";
|
||||
}
|
||||
|
||||
@Test public void testUnknownGlobalDynamicAttribute() throws Exception {
|
||||
String action = "$Symbols::x";
|
||||
}
|
||||
|
||||
@Test public void testUnqualifiedRuleScopeAttribute() throws Exception {
|
||||
String action = "$n;"; // must be qualified
|
||||
}
|
||||
@Test public void testRuleAndTokenLabelTypeMismatch() throws Exception {
|
||||
}
|
||||
@Test public void testListAndTokenLabelTypeMismatch() throws Exception {
|
||||
}
|
||||
@Test public void testListAndRuleLabelTypeMismatch() throws Exception {
|
||||
}
|
||||
@Test public void testArgReturnValueMismatch() throws Exception {
|
||||
}
|
||||
@Test public void testSimplePlusEqualLabel() throws Exception {
|
||||
String action = "$ids.size();"; // must be qualified
|
||||
}
|
||||
@Test public void testPlusEqualStringLabel() throws Exception {
|
||||
String action = "$ids.size();"; // must be qualified
|
||||
}
|
||||
@Test public void testPlusEqualSetLabel() throws Exception {
|
||||
String action = "$ids.size();"; // must be qualified
|
||||
}
|
||||
@Test public void testPlusEqualWildcardLabel() throws Exception {
|
||||
String action = "$ids.size();"; // must be qualified
|
||||
}
|
||||
@Test public void testImplicitTokenLabel() throws Exception {
|
||||
String action = "$ID; $ID.text; $ID.getText()";
|
||||
}
|
||||
|
||||
@Test public void testImplicitRuleLabel() throws Exception {
|
||||
String action = "$r.start;";
|
||||
}
|
||||
|
||||
@Test public void testReuseExistingLabelWithImplicitRuleLabel() throws Exception {
|
||||
String action = "$r.start;";
|
||||
}
|
||||
|
||||
@Test public void testReuseExistingListLabelWithImplicitRuleLabel() throws Exception {
|
||||
String action = "$r.start;";
|
||||
}
|
||||
|
||||
@Test public void testReuseExistingLabelWithImplicitTokenLabel() throws Exception {
|
||||
String action = "$ID.text;";
|
||||
}
|
||||
|
||||
@Test public void testReuseExistingListLabelWithImplicitTokenLabel() throws Exception {
|
||||
String action = "$ID.text;";
|
||||
}
|
||||
|
||||
@Test public void testRuleLabelWithoutOutputOption() throws Exception {
|
||||
}
|
||||
@Test public void testRuleLabelOnTwoDifferentRulesAST() throws Exception {
|
||||
}
|
||||
@Test public void testRuleLabelOnTwoDifferentRulesTemplate() throws Exception {
|
||||
}
|
||||
@Test public void testMissingArgs() throws Exception {
|
||||
}
|
||||
@Test public void testArgsWhenNoneDefined() throws Exception {
|
||||
}
|
||||
@Test public void testReturnInitValue() throws Exception {
|
||||
}
|
||||
@Test public void testMultipleReturnInitValue() throws Exception {
|
||||
}
|
||||
@Test public void testCStyleReturnInitValue() throws Exception {
|
||||
}
|
||||
@Test public void testArgsWithInitValues() throws Exception {
|
||||
}
|
||||
@Test public void testArgsOnToken() throws Exception {
|
||||
}
|
||||
@Test public void testArgsOnTokenInLexer() throws Exception {
|
||||
}
|
||||
@Test public void testLabelOnRuleRefInLexer() throws Exception {
|
||||
String action = "$i.text";
|
||||
}
|
||||
|
||||
@Test public void testRefToRuleRefInLexer() throws Exception {
|
||||
String action = "$ID.text";
|
||||
}
|
||||
|
||||
@Test public void testRefToRuleRefInLexerNoAttribute() throws Exception {
|
||||
String action = "$ID";
|
||||
}
|
||||
|
||||
@Test public void testCharLabelInLexer() throws Exception {
|
||||
}
|
||||
@Test public void testCharListLabelInLexer() throws Exception {
|
||||
}
|
||||
@Test public void testWildcardCharLabelInLexer() throws Exception {
|
||||
}
|
||||
@Test public void testWildcardCharListLabelInLexer() throws Exception {
|
||||
}
|
||||
@Test public void testMissingArgsInLexer() throws Exception {
|
||||
}
|
||||
@Test public void testLexerRulePropertyRefs() throws Exception {
|
||||
String action = "$text $type $line $pos $channel $index $start $stop";
|
||||
}
|
||||
|
||||
@Test public void testLexerLabelRefs() throws Exception {
|
||||
String action = "$a $b.text $c $d.text";
|
||||
}
|
||||
|
||||
@Test public void testSettingLexerRulePropertyRefs() throws Exception {
|
||||
String action = "$text $type=1 $line=1 $pos=1 $channel=1 $index";
|
||||
}
|
||||
|
||||
@Test public void testArgsOnTokenInLexerRuleOfCombined() throws Exception {
|
||||
}
|
||||
@Test public void testMissingArgsOnTokenInLexerRuleOfCombined() throws Exception {
|
||||
}
|
||||
@Test public void testTokenLabelTreeProperty() throws Exception {
|
||||
String action = "$id.tree;";
|
||||
}
|
||||
|
||||
@Test public void testTokenRefTreeProperty() throws Exception {
|
||||
String action = "$ID.tree;";
|
||||
}
|
||||
|
||||
@Test public void testAmbiguousTokenRef() throws Exception {
|
||||
String action = "$ID;";
|
||||
}
|
||||
|
||||
@Test public void testAmbiguousTokenRefWithProp() throws Exception {
|
||||
String action = "$ID.text;";
|
||||
}
|
||||
|
||||
@Test public void testRuleRefWithDynamicScope() throws Exception {
|
||||
String action = "$field::x = $field.st;";
|
||||
}
|
||||
|
||||
@Test public void testAssignToOwnRulenameAttr() throws Exception {
|
||||
String action = "$rule.tree = null;";
|
||||
}
|
||||
|
||||
@Test public void testAssignToOwnParamAttr() throws Exception {
|
||||
String action = "$rule.i = 42; $i = 23;";
|
||||
}
|
||||
|
||||
@Test public void testIllegalAssignToOwnRulenameAttr() throws Exception {
|
||||
String action = "$rule.stop = 0;";
|
||||
}
|
||||
|
||||
@Test public void testIllegalAssignToLocalAttr() throws Exception {
|
||||
String action = "$tree = null; $st = null; $start = 0; $stop = 0; $text = 0;";
|
||||
}
|
||||
|
||||
@Test public void testIllegalAssignRuleRefAttr() throws Exception {
|
||||
String action = "$other.tree = null;";
|
||||
}
|
||||
|
||||
@Test public void testIllegalAssignTokenRefAttr() throws Exception {
|
||||
String action = "$ID.text = \"test\";";
|
||||
}
|
||||
|
||||
@Test public void testAssignToTreeNodeAttribute() throws Exception {
|
||||
String action = "$tree.scope = localScope;";
|
||||
}
|
||||
|
||||
@Test public void testDoNotTranslateAttributeCompare() throws Exception {
|
||||
String action = "$a.line == $b.line";
|
||||
}
|
||||
|
||||
@Test public void testDoNotTranslateScopeAttributeCompare() throws Exception {
|
||||
String action = "if ($rule::foo == \"foo\" || 1) { System.out.println(\"ouch\"); }";
|
||||
}
|
||||
|
||||
@Test public void testTreeRuleStopAttributeIsInvalid() throws Exception {
|
||||
String action = "$r.x; $r.start; $r.stop";
|
||||
}
|
||||
|
||||
@Test public void testRefToTextAttributeForCurrentTreeRule() throws Exception {
|
||||
String action = "$text";
|
||||
}
|
||||
|
||||
@Test public void testTypeOfGuardedAttributeRefIsCorrect() throws Exception {
|
||||
String action = "int x = $b::n;";
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,61 @@
|
|||
package org.antlr.v4.test;
|
||||
|
||||
import org.antlr.v4.parse.ScopeParser;
|
||||
import org.junit.Test;
|
||||
|
||||
public class TestScopeParsing extends BaseTest {
|
||||
String[] argPairs = {
|
||||
"int i", "{i=int i}",
|
||||
"int[] i, int j[]", "{i=int[] i, j=int [] j}",
|
||||
"Map<A\\,B>[] i, int j[]", "{i=Map<A,B>[] i, j=int [] j}",
|
||||
"int i = 34+a[3], int j[] = new int[34]",
|
||||
"{i=int i= 34+a[3], j=int [] j= new int[34]}",
|
||||
"char *foo32[3] = {1\\,2\\,3}", "{3=char *foo32[] 3= {1,2,3}}",
|
||||
|
||||
// python/ruby style
|
||||
"i", "{i=null i}",
|
||||
"i,j", "{i=null i, j=null j}",
|
||||
"i,j, k", "{i=null i, j=null j, k=null k}",
|
||||
};
|
||||
|
||||
String[] scopePairs = {
|
||||
"int i;", "{i=int i}",
|
||||
"int[] i; int j[];", "{i=int[] i, j=int [] j}",
|
||||
"Map<A,B>[] i; int j[];", "{i=Map<A,B>[] i, j=int [] j}",
|
||||
"int i = 34+a[3]; int j[] = new int[34];",
|
||||
"{i=int i= 34+a[3], j=int [] j= new int[34]}",
|
||||
"char *foo32[] = {1,2,3};", "{foo32=char *[] foo32= {1,2,3}}",
|
||||
|
||||
// python/ruby style
|
||||
"i", "{i=null i}",
|
||||
"i; j;", "{i=null i, j=null j}",
|
||||
"i; j; k;", "{i=null i, j=null j, k=null k}",
|
||||
};
|
||||
|
||||
public void testInputOutputPairs(String[] pairs) {
|
||||
for (int i = 0; i < pairs.length; i+=2) {
|
||||
String input = pairs[i];
|
||||
String expected = pairs[i+1];
|
||||
String actual = ScopeParser.parseTypeList(input).attributes.toString();
|
||||
assertEquals(expected, actual);
|
||||
}
|
||||
}
|
||||
|
||||
@Test public void testArgs() {
|
||||
for (int i = 0; i < argPairs.length; i+=2) {
|
||||
String input = argPairs[i];
|
||||
String expected = argPairs[i+1];
|
||||
String actual = ScopeParser.parseTypeList(input).attributes.toString();
|
||||
assertEquals(expected, actual);
|
||||
}
|
||||
}
|
||||
|
||||
@Test public void testScopes() {
|
||||
for (int i = 0; i < scopePairs.length; i+=2) {
|
||||
String input = scopePairs[i];
|
||||
String expected = scopePairs[i+1];
|
||||
String actual = ScopeParser.parseDynamicScope(input).attributes.toString();
|
||||
assertEquals(expected, actual);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue