forked from jasder/antlr
Verify behavior of CompositeGrammars tests, and correct discrepancies
This commit is contained in:
parent
990fd9d811
commit
364d984437
|
@ -21,12 +21,12 @@ Errors() ::= ""
|
||||||
masterGrammar(grammarName, slaveGrammarName) ::= <<
|
masterGrammar(grammarName, slaveGrammarName) ::= <<
|
||||||
lexer grammar <grammarName>;
|
lexer grammar <grammarName>;
|
||||||
import <slaveGrammarName>;
|
import <slaveGrammarName>;
|
||||||
A : 'a' B {<writeln("\"M.A\"")>};
|
A : 'a' B {<writeln("\"M.A\"")>} ;
|
||||||
WS : (' '|'\n') -> skip ;
|
WS : (' '|'\n') -> skip ;
|
||||||
>>
|
>>
|
||||||
|
|
||||||
slaveGrammar(grammarName) ::= <<
|
slaveGrammar(grammarName) ::= <<
|
||||||
lexer grammar <grammarName>;
|
lexer grammar <grammarName>;
|
||||||
A : 'a' {<writeln("\"S.A\"")>};
|
A : 'a' {<writeln("\"S.A\"")>} ;
|
||||||
B : 'b' {<writeln("\"S.B\"")>};
|
B : 'b' {<writeln("\"S.B\"")>} ;
|
||||||
>>
|
>>
|
||||||
|
|
|
@ -60,7 +60,7 @@ x : A {<writeln("\"S.x\"")>};
|
||||||
>>
|
>>
|
||||||
|
|
||||||
slaveGrammarT(grammarName) ::= <<
|
slaveGrammarT(grammarName) ::= <<
|
||||||
parser grammar S;
|
parser grammar T;
|
||||||
tokens { C, B, A } // reverse order
|
tokens { C, B, A } // reverse order
|
||||||
y : A {<writeln("\"T.y\"")>};
|
y : A {<writeln("\"T.y\"")>};
|
||||||
>>
|
>>
|
||||||
|
|
|
@ -21,13 +21,13 @@ Errors() ::= ""
|
||||||
masterGrammar(grammarName, slaveGrammarName) ::= <<
|
masterGrammar(grammarName, slaveGrammarName) ::= <<
|
||||||
grammar M; // uses no rules from the import
|
grammar M; // uses no rules from the import
|
||||||
import S;
|
import S;
|
||||||
s : 'b'{<Invoke_foo()>}; // gS is import pointer
|
s : 'b' {<Invoke_foo()>} ; // gS is import pointer
|
||||||
WS : (' '|'\n') -> skip ;
|
WS : (' '|'\n') -> skip ;
|
||||||
>>
|
>>
|
||||||
|
|
||||||
slaveGrammar(grammarName) ::= <<
|
slaveGrammar(grammarName) ::= <<
|
||||||
parser grammar S;
|
parser grammar S;
|
||||||
@members {
|
@parser::members {
|
||||||
<Declare_foo()>
|
<Declare_foo()>
|
||||||
}
|
}
|
||||||
a : B;
|
a : B;
|
||||||
|
|
|
@ -28,5 +28,5 @@ WS : (' '|'\n') -> skip ;
|
||||||
|
|
||||||
slaveGrammar(grammarName) ::= <<
|
slaveGrammar(grammarName) ::= <<
|
||||||
parser grammar S;
|
parser grammar S;
|
||||||
a[int x] returns [int y] : B {<write("\"S.a\"")>;$y=1000;};
|
a[int x] returns [int y] : B {<write("\"S.a\"")> $y=1000;} ;
|
||||||
>>
|
>>
|
||||||
|
|
|
@ -28,5 +28,5 @@ WS : (' '|'\n') -> skip ;
|
||||||
|
|
||||||
slaveGrammar(grammarName) ::= <<
|
slaveGrammar(grammarName) ::= <<
|
||||||
parser grammar S;
|
parser grammar S;
|
||||||
a : B {<write("\"S.a\"")>};
|
a : B {<write("\"S.a\"")>} ;
|
||||||
>>
|
>>
|
||||||
|
|
|
@ -29,11 +29,11 @@ WS : (' '|'\n') -> skip ;
|
||||||
|
|
||||||
slaveGrammarS(grammarName) ::= <<
|
slaveGrammarS(grammarName) ::= <<
|
||||||
parser grammar S;
|
parser grammar S;
|
||||||
a : B {<writeln("\"S.a\"")>};
|
a : b {<writeln("\"S.a\"")>};
|
||||||
b : B;
|
b : B;
|
||||||
>>
|
>>
|
||||||
|
|
||||||
slaveGrammarT(grammarName) ::= <<
|
slaveGrammarT(grammarName) ::= <<
|
||||||
parser grammar T;
|
parser grammar T;
|
||||||
a : B {<writeln("\"T.a\"")>};
|
a : B {<writeln("\"T.a\"")>};<! hidden by S.a !>
|
||||||
>>
|
>>
|
||||||
|
|
|
@ -34,7 +34,7 @@ b : 'b' ;
|
||||||
>>
|
>>
|
||||||
|
|
||||||
slaveGrammarT(grammarName) ::= <<
|
slaveGrammarT(grammarName) ::= <<
|
||||||
parser grammar S;
|
parser grammar T;
|
||||||
tokens { A }
|
tokens { A }
|
||||||
b : 'b' {<writeln("\"T.b\"")>};
|
b : 'b' {<writeln("\"T.b\"")>};
|
||||||
>>
|
>>
|
||||||
|
|
|
@ -13,16 +13,17 @@ Rule() ::= "prog"
|
||||||
Input() ::= "float x = 3;"
|
Input() ::= "float x = 3;"
|
||||||
|
|
||||||
Output() ::= <<
|
Output() ::= <<
|
||||||
Decl: floatx=3;<\n>
|
JavaDecl: floatx=3;<\n>
|
||||||
>>
|
>>
|
||||||
|
|
||||||
Errors() ::= ""
|
Errors() ::= ""
|
||||||
|
|
||||||
|
// for float to work in decl, type must be overridden
|
||||||
masterGrammar(grammarName, slaveGrammarName) ::= <<
|
masterGrammar(grammarName, slaveGrammarName) ::= <<
|
||||||
grammar M;
|
grammar M;
|
||||||
import S;
|
import S;
|
||||||
prog : decl ;
|
prog : decl ;
|
||||||
type_ : 'int' | 'float' ;
|
type : 'int' | 'float' ;
|
||||||
ID : 'a'..'z'+ ;
|
ID : 'a'..'z'+ ;
|
||||||
INT : '0'..'9'+ ;
|
INT : '0'..'9'+ ;
|
||||||
WS : (' '|'\n') -> skip;
|
WS : (' '|'\n') -> skip;
|
||||||
|
@ -30,8 +31,8 @@ WS : (' '|'\n') -> skip;
|
||||||
|
|
||||||
slaveGrammar(grammarName) ::= <<
|
slaveGrammar(grammarName) ::= <<
|
||||||
parser grammar S;
|
parser grammar S;
|
||||||
type_ : 'int' ;
|
type : 'int' ;
|
||||||
decl : type_ ID ';'
|
decl : type ID ';'
|
||||||
| type_ ID init ';' {<write("\"Decl: \" + $text")>};
|
| type ID init ';' {<write("\"JavaDecl: \" + $text")>};
|
||||||
init : '=' INT;
|
init : '=' INT;
|
||||||
>>
|
>>
|
||||||
|
|
|
@ -1,11 +1,17 @@
|
||||||
|
/*
|
||||||
|
* This is a regression test for antlr/antlr4#248 "Including grammar with only
|
||||||
|
* fragments breaks generated lexer".
|
||||||
|
* https://github.com/antlr/antlr4/issues/248
|
||||||
|
*/
|
||||||
|
|
||||||
TestType() ::= "CompositeParser"
|
TestType() ::= "CompositeParser"
|
||||||
|
|
||||||
Grammar ::= [
|
Grammar ::= [
|
||||||
"M": {<masterGrammar("M", "S")>}
|
"Test": {<masterGrammar("Test", "Unicode")>}
|
||||||
]
|
]
|
||||||
|
|
||||||
SlaveGrammars ::= [
|
SlaveGrammars ::= [
|
||||||
"S": {<slaveGrammar("S")>}
|
"Unicode": {<slaveGrammar("Unicode")>}
|
||||||
]
|
]
|
||||||
|
|
||||||
Rule() ::= "program"
|
Rule() ::= "program"
|
||||||
|
@ -18,17 +24,22 @@ Output() ::= <<
|
||||||
Errors() ::= ""
|
Errors() ::= ""
|
||||||
|
|
||||||
masterGrammar(grammarName, slaveGrammarName) ::= <<
|
masterGrammar(grammarName, slaveGrammarName) ::= <<
|
||||||
grammar M;
|
grammar <grammarName>;
|
||||||
import S;
|
import <slaveGrammarName; separator=", ">;
|
||||||
|
|
||||||
program : 'test' 'test';
|
program : 'test' 'test';
|
||||||
|
|
||||||
WS : (UNICODE_CLASS_Zs)+ -> skip;
|
WS : (UNICODE_CLASS_Zs)+ -> skip;
|
||||||
|
|
||||||
>>
|
>>
|
||||||
|
|
||||||
slaveGrammar(grammarName) ::= <<
|
slaveGrammar(grammarName) ::= <<
|
||||||
lexer grammar S;
|
lexer grammar <grammarName>;
|
||||||
|
|
||||||
fragment
|
fragment
|
||||||
UNICODE_CLASS_Zs : '\u0020' | '\u00A0' | '\u1680' | '\u180E'
|
UNICODE_CLASS_Zs : '\u0020' | '\u00A0' | '\u1680' | '\u180E'
|
||||||
| '\u2000'..'\u200A'
|
| '\u2000'..'\u200A'
|
||||||
| '\u202F' | '\u205F' | '\u3000'
|
| '\u202F' | '\u205F' | '\u3000'
|
||||||
;
|
;
|
||||||
|
|
||||||
>>
|
>>
|
||||||
|
|
|
@ -20,13 +20,13 @@ Errors() ::= ""
|
||||||
masterGrammar(grammarName, slaveGrammarName) ::= <<
|
masterGrammar(grammarName, slaveGrammarName) ::= <<
|
||||||
grammar M;
|
grammar M;
|
||||||
import S;
|
import S;
|
||||||
s : a;
|
s : a ;
|
||||||
B : 'b';
|
B : 'b' ;
|
||||||
WS : (' '|'\n') -> skip ;
|
WS : (' '|'\n') -> skip ;
|
||||||
>>
|
>>
|
||||||
|
|
||||||
slaveGrammar(grammarName) ::= <<
|
slaveGrammar(grammarName) ::= <<
|
||||||
parser grammar S;
|
parser grammar S;
|
||||||
options {}
|
options {}
|
||||||
a : B;
|
a : B ;
|
||||||
>>
|
>>
|
||||||
|
|
|
@ -25,7 +25,8 @@ B : 'b';
|
||||||
WS : (' '|'\n') -> skip ;
|
WS : (' '|'\n') -> skip ;
|
||||||
>>
|
>>
|
||||||
|
|
||||||
|
// wasn't terminating. @after was injected into M as if it were @members
|
||||||
slaveGrammar(grammarName) ::= <<
|
slaveGrammar(grammarName) ::= <<
|
||||||
parser grammar S;
|
parser grammar S;
|
||||||
a @after {} : B;
|
a @after {int x;} : B;
|
||||||
>>
|
>>
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
// rules in lexer are imported at END so rules in master override
|
||||||
|
// *and* get priority over imported rules. So importing ID doesn't
|
||||||
|
// mess up keywords in master grammar
|
||||||
|
|
||||||
TestType() ::= "CompositeParser"
|
TestType() ::= "CompositeParser"
|
||||||
|
|
||||||
Grammar ::= [
|
Grammar ::= [
|
||||||
|
|
|
@ -381,9 +381,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
>>
|
>>
|
||||||
|
|
||||||
Declare_foo() ::= <<public void foo() {System.out.println("foo");}>>
|
Declare_foo() ::= <<
|
||||||
|
public void foo() {System.out.println("foo");}
|
||||||
|
>>
|
||||||
|
|
||||||
Invoke_foo() ::= "this.foo();"
|
Invoke_foo() ::= "foo();"
|
||||||
|
|
||||||
Declare_pred() ::= <<boolean pred(boolean v) {
|
Declare_pred() ::= <<boolean pred(boolean v) {
|
||||||
System.out.println("eval="+v);
|
System.out.println("eval="+v);
|
||||||
|
|
|
@ -127,8 +127,6 @@ public class TestCompositeGrammars extends BaseTest {
|
||||||
assertEquals(0, equeue.size());
|
assertEquals(0, equeue.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Test public void testImportedTokenVocabIgnoredWithWarning() throws Exception {
|
@Test public void testImportedTokenVocabIgnoredWithWarning() throws Exception {
|
||||||
ErrorQueue equeue = new ErrorQueue();
|
ErrorQueue equeue = new ErrorQueue();
|
||||||
String slave =
|
String slave =
|
||||||
|
@ -382,7 +380,6 @@ public class TestCompositeGrammars extends BaseTest {
|
||||||
assertEquals(expecting, equeue.errors.size());
|
assertEquals(expecting, equeue.errors.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is a regression test for antlr/antlr4#670 "exception when importing
|
* This is a regression test for antlr/antlr4#670 "exception when importing
|
||||||
* grammar".
|
* grammar".
|
||||||
|
|
Loading…
Reference in New Issue