aboutsummaryrefslogtreecommitdiff
path: root/runtime/Ruby/test/functional/ast-output/hetero-nodes.rb
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/Ruby/test/functional/ast-output/hetero-nodes.rb')
-rw-r--r--runtime/Ruby/test/functional/ast-output/hetero-nodes.rb751
1 files changed, 751 insertions, 0 deletions
diff --git a/runtime/Ruby/test/functional/ast-output/hetero-nodes.rb b/runtime/Ruby/test/functional/ast-output/hetero-nodes.rb
new file mode 100644
index 0000000..7b62339
--- /dev/null
+++ b/runtime/Ruby/test/functional/ast-output/hetero-nodes.rb
@@ -0,0 +1,751 @@
+#!/usr/bin/ruby
+# encoding: utf-8
+
+require 'antlr3/test/functional'
+
+
+class TestHeterogeneousNodeTypes < ANTLR3::Test::Functional
+
+ inline_grammar( <<-'END' )
+ grammar VToken;
+ options {
+ language=Ruby;
+ output=AST;
+ }
+ @members {
+ class V < ANTLR3::CommonTree
+ def to_s
+ return @token.text + "<V>"
+ end
+ end
+ }
+ a : ID<V> ;
+ ID : 'a'..'z'+ ;
+ WS : (' '|'\n') {$channel=HIDDEN;} ;
+ END
+
+
+ inline_grammar( <<-'END' )
+ grammar TokenWithQualifiedType;
+ options {
+ language=Ruby;
+ output=AST;
+ }
+ @members {
+ class V < ANTLR3::CommonTree
+ def to_s
+ return @token.text + "<V>"
+ end
+ end
+ }
+ a : ID<TokenWithQualifiedType.Parser.V> ;
+ ID : 'a'..'z'+ ;
+ WS : (' '|'\n') {$channel=HIDDEN;} ;
+ END
+
+
+ inline_grammar( <<-'END' )
+ grammar TokenWithLabel;
+ options {
+ language=Ruby;
+ output=AST;
+ }
+ @members {
+ class V < ANTLR3::CommonTree
+ def to_s
+ return @token.text + "<V>"
+ end
+ end
+ }
+ a : x=ID<V> ;
+ ID : 'a'..'z'+ ;
+ WS : (' '|'\n') {$channel=HIDDEN;} ;
+ END
+
+
+ inline_grammar( <<-'END' )
+ grammar TokenWithListLabel;
+ options {
+ language=Ruby;
+ output=AST;
+ }
+ @members {
+ class V < ANTLR3::CommonTree
+ def to_s
+ return @token.text + "<V>"
+ end
+ end
+ }
+ a : x+=ID<V> ;
+ ID : 'a'..'z'+ ;
+ WS : (' '|'\n') {$channel=HIDDEN;} ;
+ END
+
+
+ inline_grammar( <<-'END' )
+ grammar TokenRoot;
+ options {
+ language=Ruby;
+ output=AST;
+ }
+ @members {
+ class V < ANTLR3::CommonTree
+ def to_s
+ return @token.text + "<V>"
+ end
+ end
+
+ }
+ a : ID<V>^ ;
+ ID : 'a'..'z'+ ;
+ WS : (' '|'\n') {$channel=HIDDEN;} ;
+ END
+
+
+ inline_grammar( <<-'END' )
+ grammar TokenRootWithListLabel;
+ options {
+ language=Ruby;
+ output=AST;
+ }
+ @members {
+ class V < ANTLR3::CommonTree
+ def to_s
+ return @token.text + "<V>"
+ end
+ end
+
+ }
+ a : x+=ID<V>^ ;
+ ID : 'a'..'z'+ ;
+ WS : (' '|'\n') {$channel=HIDDEN;} ;
+ END
+
+
+ inline_grammar( <<-'END' )
+ grammar FromString;
+ options {
+ language=Ruby;
+ output=AST;
+ }
+ @members {
+ class V < ANTLR3::CommonTree
+ def to_s
+ return @token.text + "<V>"
+ end
+ end
+
+ }
+ a : 'begin'<V> ;
+ ID : 'a'..'z'+ ;
+ WS : (' '|'\n') {$channel=HIDDEN;} ;
+ END
+
+
+ inline_grammar( <<-'END' )
+ grammar StringRoot;
+ options {
+ language=Ruby;
+ output=AST;
+ }
+ @members {
+ class V < ANTLR3::CommonTree
+ def to_s
+ return @token.text + "<V>"
+ end
+ end
+
+ }
+ a : 'begin'<V>^ ;
+ ID : 'a'..'z'+ ;
+ WS : (' '|'\n') {$channel=HIDDEN;} ;
+ END
+
+
+ inline_grammar( <<-'END' )
+ grammar RewriteToken;
+ options {
+ language=Ruby;
+ output=AST;
+ }
+ @members {
+ class V < ANTLR3::CommonTree
+ def to_s
+ return @token.text + "<V>"
+ end
+ end
+
+ }
+ a : ID -> ID<V> ;
+ ID : 'a'..'z'+ ;
+ WS : (' '|'\n') {$channel=HIDDEN;} ;
+ END
+
+
+ inline_grammar( <<-'END' )
+ grammar RewriteTokenWithArgs;
+ options {
+ language=Ruby;
+ output=AST;
+ }
+ @members {
+ class V < ANTLR3::CommonTree
+ def initialize(*args)
+ case args.length
+ when 4
+ ttype, @x, @y, @z = args
+ token = ANTLR3::CommonToken.new(ttype, nil, '')
+ when 3
+ ttype, token, @x = args
+ @y = @z = 0
+ else raise ArgumentError, "invalid number of arguments: #{args.length} for 3-4"
+ end
+ super(token)
+ end
+
+ def to_s
+ (@token.text.to_s rescue '') << "<V>;\%d\%d\%d" \% [@x, @y, @z]
+ end
+ end
+
+ }
+ a : ID -> ID<V>[42,19,30] ID<V>[$ID,99];
+ ID : 'a'..'z'+ ;
+ WS : (' '|'\n') {$channel=HIDDEN;} ;
+ END
+
+
+ inline_grammar( <<-'END' )
+ grammar RewriteTokenRoot;
+ options {
+ language=Ruby;
+ output=AST;
+ }
+ @members {
+ class V < ANTLR3::CommonTree
+ def to_s
+ return @token.text + "<V>"
+ end
+ end
+
+ }
+ a : ID INT -> ^(ID<V> INT) ;
+ ID : 'a'..'z'+ ;
+ INT : '0'..'9'+ ;
+ WS : (' '|'\n') {$channel=HIDDEN;} ;
+ END
+
+
+ inline_grammar( <<-'END' )
+ grammar RewriteString;
+ options {
+ language=Ruby;
+ output=AST;
+ }
+ @members {
+ class V < ANTLR3::CommonTree
+ def to_s
+ return @token.text + "<V>"
+ end
+ end
+
+ }
+ a : 'begin' -> 'begin'<V> ;
+ ID : 'a'..'z'+ ;
+ WS : (' '|'\n') {$channel=HIDDEN;} ;
+ END
+
+
+ inline_grammar( <<-'END' )
+ grammar RewriteStringRoot;
+ options {
+ language=Ruby;
+ output=AST;
+ }
+ @members {
+ class V < ANTLR3::CommonTree
+ def to_s
+ return @token.text + "<V>"
+ end
+ end
+
+ }
+ a : 'begin' INT -> ^('begin'<V> INT) ;
+ ID : 'a'..'z'+ ;
+ INT : '0'..'9'+ ;
+ WS : (' '|'\n') {$channel=HIDDEN;} ;
+ END
+
+
+ inline_grammar( <<-'END' )
+ grammar RewriteRuleResults;
+ options {
+ language=Ruby;
+ output=AST;
+ }
+ tokens {LIST;}
+ @members {
+ class V < ANTLR3::CommonTree
+ def to_s
+ return @token.text + "<V>"
+ end
+ end
+ class W < ANTLR3::CommonTree
+ def initialize(tok, text)
+ tok.text = text
+ super(tok)
+ end
+ def to_s
+ return @token.text + "<W>"
+ end
+ end
+
+ }
+ a : id (',' id)* -> ^(LIST<W>["LIST"] id+);
+ id : ID -> ID<V>;
+ ID : 'a'..'z'+ ;
+ WS : (' '|'\n') {$channel=HIDDEN;} ;
+ END
+
+
+ inline_grammar( <<-'END' )
+ grammar CopySemanticsWithHetero;
+ options {
+ language=Ruby;
+ output=AST;
+ }
+ @members {
+ class V < ANTLR3::CommonTree
+ def dup_node
+ return V.new(self)
+ end
+ def to_s
+ return @token.text + "<V>"
+ end
+ end
+ }
+ a : type ID (',' ID)* ';' -> ^(type ID)+;
+ type : 'int'<V> ;
+ ID : 'a'..'z'+ ;
+ INT : '0'..'9'+;
+ WS : (' '|'\\n') {$channel=HIDDEN;} ;
+ END
+
+
+ inline_grammar( <<-'END' )
+ grammar TreeParserRewriteFlatList;
+ options {
+ language=Ruby;
+ output=AST;
+ }
+ a : ID INT;
+ ID : 'a'..'z'+ ;
+ INT : '0'..'9'+;
+ WS : (' '|'\n') {$channel=HIDDEN;} ;
+ END
+
+
+ inline_grammar( <<-'END' )
+ tree grammar TreeParserRewriteFlatListWalker;
+ options {
+ language=Ruby;
+ output=AST;
+ ASTLabelType=CommonTree;
+ tokenVocab=TreeParserRewriteFlatList;
+ }
+ @members {
+ class V < ANTLR3::CommonTree
+ def to_s
+ return @token.text + "<V>"
+ end
+ end
+ class W < ANTLR3::CommonTree
+ def to_s
+ return @token.text + "<W>"
+ end
+ end
+ }
+ a : ID INT -> INT<V> ID<W>
+ ;
+ END
+
+
+ inline_grammar( <<-'END' )
+ grammar TreeParserRewriteTree;
+ options {
+ language=Ruby;
+ output=AST;
+ }
+ a : ID INT;
+ ID : 'a'..'z'+ ;
+ INT : '0'..'9'+;
+ WS : (' '|'\n') {$channel=HIDDEN;} ;
+ END
+
+
+ inline_grammar( <<-'END' )
+ tree grammar TreeParserRewriteTreeWalker;
+ options {
+ language=Ruby;
+ output=AST;
+ ASTLabelType=CommonTree;
+ tokenVocab=TreeParserRewriteTree;
+ }
+ @members {
+ class V < ANTLR3::CommonTree
+ def to_s
+ return @token.text + "<V>"
+ end
+ end
+
+ class W < ANTLR3::CommonTree
+ def to_s
+ return @token.text + "<W>"
+ end
+ end
+ }
+ a : ID INT -> ^(INT<V> ID<W>)
+ ;
+ END
+
+
+ inline_grammar( <<-'END' )
+ grammar TreeParserRewriteImaginary;
+ options {
+ language=Ruby;
+ output=AST;
+ }
+ a : ID ;
+ ID : 'a'..'z'+ ;
+ INT : '0'..'9'+;
+ WS : (' '|'\n') {$channel=HIDDEN;} ;
+ END
+
+
+ inline_grammar( <<-'END' )
+ tree grammar TreeParserRewriteImaginaryWalker;
+ options {
+ language=Ruby;
+ output=AST;
+ ASTLabelType=CommonTree;
+ tokenVocab=TreeParserRewriteImaginary;
+ }
+ tokens { ROOT; }
+ @members {
+ class V < ANTLR3::CommonTree
+ def to_s
+ return @token.name + "<V>"
+ end
+ end
+ }
+ a : ID -> ROOT<V> ID
+ ;
+ END
+
+
+ inline_grammar( <<-'END' )
+ grammar TreeParserRewriteImaginaryWithArgs;
+ options {
+ language=Ruby;
+ output=AST;
+ }
+ a : ID ;
+ ID : 'a'..'z'+ ;
+ INT : '0'..'9'+;
+ WS : (' '|'\n') {$channel=HIDDEN;} ;
+ END
+
+
+ inline_grammar( <<-'END' )
+ tree grammar TreeParserRewriteImaginaryWithArgsWalker;
+ options {
+ language=Ruby;
+ output=AST;
+ ASTLabelType=CommonTree;
+ tokenVocab=TreeParserRewriteImaginaryWithArgs;
+ }
+ tokens { ROOT; }
+ @members {
+ class V < ANTLR3::CommonTree
+ def initialize(token_type, x)
+ super(token_type)
+ @x = x
+ end
+ def to_s
+ return @token.name + "<V>;#@x"
+ end
+ end
+ }
+ a : ID -> ROOT<V>[42] ID
+ ;
+ END
+
+
+ inline_grammar( <<-'END' )
+ grammar TreeParserRewriteImaginaryRoot;
+ options {
+ language=Ruby;
+ output=AST;
+ }
+ a : ID ;
+ ID : 'a'..'z'+ ;
+ INT : '0'..'9'+;
+ WS : (' '|'\n') {$channel=HIDDEN;} ;
+ END
+
+
+ inline_grammar( <<-'END' )
+ tree grammar TreeParserRewriteImaginaryRootWalker;
+ options {
+ language=Ruby;
+ output=AST;
+ ASTLabelType=CommonTree;
+ tokenVocab=TreeParserRewriteImaginaryRoot;
+ }
+ tokens { ROOT; }
+ @members {
+ class V < ANTLR3::CommonTree
+ def to_s
+ return @token.name + "<V>"
+ end
+ end
+ }
+ a : ID -> ^(ROOT<V> ID)
+ ;
+ END
+
+
+ inline_grammar( <<-'END' )
+ grammar TreeParserRewriteImaginaryFromReal;
+ options {
+ language=Ruby;
+ output=AST;
+ }
+ a : ID ;
+ ID : 'a'..'z'+ ;
+ INT : '0'..'9'+;
+ WS : (' '|'\n') {$channel=HIDDEN;} ;
+ END
+
+
+ inline_grammar( <<-'END' )
+ tree grammar TreeParserRewriteImaginaryFromRealWalker;
+ options {
+ language=Ruby;
+ output=AST;
+ ASTLabelType=CommonTree;
+ tokenVocab=TreeParserRewriteImaginaryFromReal;
+ }
+ tokens { ROOT; }
+ @members {
+ class V < ANTLR3::CommonTree
+ def initialize(token, tree = nil)
+ if tree.nil? then super(token)
+ else
+ super(tree)
+ @token = TokenData::Token.from_token(@token)
+ @token.type = token.type
+ end
+ end
+ def to_s
+ return @token.name + "<V>@" + @token.line.to_s
+ end
+ end
+ }
+ a : ID -> ROOT<V>[$ID]
+ ;
+ END
+
+
+ inline_grammar( <<-'END' )
+ grammar TreeParserAutoHeteroAST;
+ options {
+ language=Ruby;
+ output=AST;
+ }
+ a : ID ';' ;
+ ID : 'a'..'z'+ ;
+ INT : '0'..'9'+;
+ WS : (' '|'\n') {$channel=HIDDEN;} ;
+ END
+
+
+ inline_grammar( <<-'END' )
+ tree grammar TreeParserAutoHeteroASTWalker;
+ options {
+ language=Ruby;
+ output=AST;
+ ASTLabelType=CommonTree;
+ tokenVocab=TreeParserAutoHeteroAST;
+ }
+ tokens { ROOT; }
+ @members {
+ class V < ANTLR3::CommonTree
+ def to_s
+ return @token.text + "<V>"
+ end
+ end
+ }
+
+ a : ID<V> ';'<V>;
+ END
+
+ def parse( grammar_name, grammar_rule, input )
+ grammar_module = self.class.const_get( grammar_name.to_s )
+ lexer = grammar_module::Lexer.new( input )
+ tokens = ANTLR3::CommonTokenStream.new( lexer )
+ parser = grammar_module::Parser.new( tokens )
+ r = parser.send( grammar_rule )
+
+ return( r.tree.inspect rescue '' )
+ end
+
+ def tree_parse( grammar_name, grammar_rule, tree_grammar_rule, input )
+ grammar_module = self.class.const_get( grammar_name.to_s )
+ tree_grammar_module = self.class.const_get( grammar_name.to_s + 'Walker' )
+
+ lexer = grammar_module::Lexer.new( input )
+ tokens = ANTLR3::CommonTokenStream.new( lexer )
+ parser = grammar_module::Parser.new( tokens )
+ r = parser.send( grammar_rule )
+
+ nodes = ANTLR3::CommonTreeNodeStream.new( r.tree )
+ nodes.token_stream = tokens
+ tree_parser = tree_grammar_module::TreeParser.new( nodes )
+ r = tree_parser.send( tree_grammar_rule )
+
+ return( r.tree.inspect rescue '' )
+ end
+
+ example "v token" do
+ result = parse( :VToken, :a, 'a' )
+ result.should == 'a<V>'
+ end
+
+
+ example "token with qualified type" do
+ result = parse( :TokenWithQualifiedType, :a, 'a' )
+ result.should == 'a<V>'
+ end
+
+
+ example "token with label" do
+ result = parse( :TokenWithLabel, :a, 'a' )
+ result.should == 'a<V>'
+ end
+
+
+ example "token with list label" do
+ result = parse( :TokenWithListLabel, :a, 'a' )
+ result.should == 'a<V>'
+ end
+
+
+ example "token root" do
+ result = parse( :TokenRoot, :a, 'a' )
+ result.should == 'a<V>'
+ end
+
+
+ example "token root with list label" do
+ result = parse( :TokenRootWithListLabel, :a, 'a' )
+ result.should == 'a<V>'
+ end
+
+
+ example "string" do
+ result = parse( :FromString, :a, 'begin' )
+ result.should == 'begin<V>'
+ end
+
+
+ example "string root" do
+ result = parse( :StringRoot, :a, 'begin' )
+ result.should == 'begin<V>'
+ end
+
+
+ example "rewrite token" do
+ result = parse( :RewriteToken, :a, 'a' )
+ result.should == 'a<V>'
+ end
+
+
+ example "rewrite token with args" do
+ result = parse( :RewriteTokenWithArgs, :a, 'a' )
+ result.should == '<V>;421930 a<V>;9900'
+ end
+
+
+ example "rewrite token root" do
+ result = parse( :RewriteTokenRoot, :a, 'a 2' )
+ result.should == '(a<V> 2)'
+ end
+
+
+ example "rewrite string" do
+ result = parse( :RewriteString, :a, 'begin' )
+ result.should == 'begin<V>'
+ end
+
+
+ example "rewrite string root" do
+ result = parse( :RewriteStringRoot, :a, 'begin 2' )
+ result.should == '(begin<V> 2)'
+ end
+
+
+ example "rewrite rule results" do
+ result = parse( :RewriteRuleResults, :a, 'a,b,c' )
+ result.should == '(LIST<W> a<V> b<V> c<V>)'
+ end
+
+
+ example "copy semantics with hetero" do
+ result = parse( :CopySemanticsWithHetero, :a, 'int a, b, c;' )
+ result.should == '(int<V> a) (int<V> b) (int<V> c)'
+ end
+
+
+ example "tree parser rewrite flat list" do
+ result = tree_parse( :TreeParserRewriteFlatList, :a, :a, 'abc 34' )
+ result.should == '34<V> abc<W>'
+ end
+
+
+ example "tree parser rewrite tree" do
+ result = tree_parse( :TreeParserRewriteTree, :a, :a, 'abc 34' )
+ result.should == '(34<V> abc<W>)'
+ end
+
+
+ example "tree parser rewrite imaginary" do
+ result = tree_parse( :TreeParserRewriteImaginary, :a, :a, 'abc' )
+ result.should == 'ROOT<V> abc'
+ end
+
+
+ example "tree parser rewrite imaginary with args" do
+ result = tree_parse( :TreeParserRewriteImaginaryWithArgs, :a, :a, 'abc' )
+ result.should == 'ROOT<V>;42 abc'
+ end
+
+
+ example "tree parser rewrite imaginary root" do
+ result = tree_parse( :TreeParserRewriteImaginaryRoot, :a, :a, 'abc' )
+ result.should == '(ROOT<V> abc)'
+ end
+
+
+ example "tree parser rewrite imaginary from real" do
+ result = tree_parse( :TreeParserRewriteImaginaryFromReal, :a, :a, 'abc' )
+ result.should == 'ROOT<V>@1'
+ end
+
+
+ example "tree parser auto hetero ast" do
+ result = tree_parse( :TreeParserAutoHeteroAST, :a, :a, 'abc;' )
+ result.should == 'abc<V> ;<V>'
+ end
+
+end