1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#!/usr/bin/ruby 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# encoding: utf-8 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrequire 'antlr3/test/functional' 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestASTViaRewriteRules < ANTLR3::Test::Functional 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def parse( grammar, rule, input, expect_errors = false ) 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @grammar = inline_grammar( grammar ) 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver compile_and_load @grammar 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar_module = self.class.const_get( @grammar.name ) 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar_module::Lexer.send( :include, ANTLR3::Test::CollectErrors ) 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar_module::Lexer.send( :include, ANTLR3::Test::CaptureOutput ) 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar_module::Parser.send( :include, ANTLR3::Test::CollectErrors ) 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar_module::Parser.send( :include, ANTLR3::Test::CaptureOutput ) 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = grammar_module::Lexer.new( input ) 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = grammar_module::Parser.new( lexer ) 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r = parser.send( rule ) 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser.reported_errors.should be_empty unless expect_errors 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = '' 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver unless r.nil? 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result += r.result if r.respond_to?( :result ) 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result += r.tree.inspect if r.tree 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return( expect_errors ? [ result, parser.reported_errors ] : result ) 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def tree_parse( grammar, tree_grammar, rule, tree_rule, input ) 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @grammar = inline_grammar( grammar ) 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @tree_grammar = inline_grammar( tree_grammar ) 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver compile_and_load @grammar 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver compile_and_load @tree_grammar 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar_module = self.class.const_get( @grammar.name ) 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree_grammar_module = self.class.const_get( @tree_grammar.name ) 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar_module::Lexer.send( :include, ANTLR3::Test::CollectErrors ) 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar_module::Lexer.send( :include, ANTLR3::Test::CaptureOutput ) 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar_module::Parser.send( :include, ANTLR3::Test::CollectErrors ) 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar_module::Parser.send( :include, ANTLR3::Test::CaptureOutput ) 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree_grammar_module::TreeParser.send( :include, ANTLR3::Test::CollectErrors ) 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree_grammar_module::TreeParser.send( :include, ANTLR3::Test::CaptureOutput ) 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = grammar_module::Lexer.new( input ) 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = grammar.module::Parser.new( lexer ) 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r = parser.send( rule ) 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes = ANTLR3::CommonTreeNodeStream( r.tree ) 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes.token_stream = parser.input 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker = tree_grammar_module::TreeParser.new( nodes ) 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r = walker.send( tree_rule ) 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return( r ? r.tree.inspect : '' ) 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "delete" do 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'abc 34' ) 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar Delete; 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT -> ; 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '' 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "single token" do 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'abc' ) 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar SingleToken; 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID -> ID; 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'abc' 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "single token to new node" do 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'abc' ) 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar SingleTokenToNewNode; 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID -> ID["x"]; 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'x' 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "single token to new node root" do 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'abc' ) 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar SingleTokenToNewNodeRoot; 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID -> ^(ID["x"] INT); 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '(x INT)' 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "single token to new node2" do 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'abc' ) 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar SingleTokenToNewNode2; 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID -> ID[ ]; 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'ID' 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "single char literal" do 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'c' ) 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar SingleCharLiteral; 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : 'c' -> 'c'; 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'c' 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "single string literal" do 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'ick' ) 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar SingleStringLiteral; 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : 'ick' -> 'ick'; 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'ick' 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "single rule" do 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'abc' ) 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar SingleRule; 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : b -> b; 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID ; 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'abc' 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "reorder tokens" do 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'abc 34' ) 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar ReorderTokens; 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT -> INT ID; 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '34 abc' 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "reorder token and rule" do 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'abc 34' ) 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar ReorderTokenAndRule; 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : b INT -> INT b; 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID ; 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '34 abc' 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "token tree" do 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'abc 34' ) 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar TokenTree; 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT -> ^(INT ID); 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '(34 abc)' 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "token tree after other stuff" do 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'void abc 34' ) 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar TokenTreeAfterOtherStuff; 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : 'void' ID INT -> 'void' ^(INT ID); 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'void (34 abc)' 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "nested token tree with outer loop" do 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'a 1 b 2' ) 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar NestedTokenTreeWithOuterLoop; 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {DUH;} 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT ID INT -> ^( DUH ID ^( DUH INT) )+ ; 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '(DUH a (DUH 1)) (DUH b (DUH 2))' 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "optional single token" do 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'abc' ) 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar OptionalSingleToken; 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID -> ID? ; 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'abc' 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "closure single token" do 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'a b' ) 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar ClosureSingleToken; 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID ID -> ID* ; 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'a b' 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "positive closure single token" do 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'a b' ) 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar PositiveClosureSingleToken; 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID ID -> ID+ ; 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'a b' 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "optional single rule" do 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'abc' ) 286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar OptionalSingleRule; 287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : b -> b?; 289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID ; 290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'abc' 296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "closure single rule" do 300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'a b' ) 301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar ClosureSingleRule; 302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : b b -> b*; 304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID ; 305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'a b' 311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "closure of label" do 315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'a b' ) 316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar ClosureOfLabel; 317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : x+=b x+=b -> $x*; 319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID ; 320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'a b' 326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "optional label no list label" do 330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'a' ) 331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar OptionalLabelNoListLabel; 332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : (x=ID)? -> $x?; 334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'a' 340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "positive closure single rule" do 344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'a b' ) 345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar PositiveClosureSingleRule; 346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : b b -> b+; 348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID ; 349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'a b' 355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "single predicate t" do 359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'abc' ) 360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar SinglePredicateT; 361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID -> {true}? ID -> ; 363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'abc' 369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "single predicate f" do 373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'abc' ) 374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar SinglePredicateF; 375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID -> {false}? ID -> ; 377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '' 383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "multiple predicate" do 387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'a 2' ) 388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar MultiplePredicate; 389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT -> {false}? ID 391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver -> {true}? INT 392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver -> 393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '2' 400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "multiple predicate trees" do 404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'a 2' ) 405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar MultiplePredicateTrees; 406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT -> {false}? ^(ID INT) 408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver -> {true}? ^(INT ID) 409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver -> ID 410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '(2 a)' 417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "simple tree" do 421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, '-34' ) 422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar SimpleTree; 423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : op INT -> ^(op INT); 425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver op : '+'|'-' ; 426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '(- 34)' 432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "simple tree2" do 436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, '+ 34' ) 437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar SimpleTree2; 438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : op INT -> ^(INT op); 440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver op : '+'|'-' ; 441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '(34 +)' 447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "nested trees" do 451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'var a:int; b:float;' ) 452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar NestedTrees; 453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : 'var' (ID ':' type ';')+ -> ^('var' ^(':' ID type)+) ; 455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type : 'int' | 'float' ; 456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '(var (: a int) (: b float))' 462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "imaginary token copy" do 466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'a,b,c' ) 467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar ImaginaryTokenCopy; 468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {VAR;} 470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID (',' ID)*-> ^(VAR ID)+ ; 471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type : 'int' | 'float' ; 472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '(VAR a) (VAR b) (VAR c)' 478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "token unreferenced on left but defined" do 482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'a' ) 483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar TokenUnreferencedOnLeftButDefined; 484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {VAR;} 486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : b -> ID ; 487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID ; 488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'ID' 494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "imaginary token copy set text" do 498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'a,b,c' ) 499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar ImaginaryTokenCopySetText; 500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {VAR;} 502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID (',' ID)*-> ^(VAR["var"] ID)+ ; 503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type : 'int' | 'float' ; 504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '(var a) (var b) (var c)' 510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "imaginary token no copy from token" do 514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, '{a b c}' ) 515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar ImaginaryTokenNoCopyFromToken; 516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {BLOCK;} 518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : lc='{' ID+ '}' -> ^(BLOCK[$lc] ID+) ; 519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type : 'int' | 'float' ; 520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '({ a b c)' 526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "imaginary token no copy from token set text" do 530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, '{a b c}' ) 531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar ImaginaryTokenNoCopyFromTokenSetText; 532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {BLOCK;} 534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : lc='{' ID+ '}' -> ^(BLOCK[$lc,"block"] ID+) ; 535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type : 'int' | 'float' ; 536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '(block a b c)' 542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "mixed rewrite and auto ast" do 546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'a 1 2' ) 547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar MixedRewriteAndAutoAST; 548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {BLOCK;} 550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : b b^ ; // 2nd b matches only an INT; can make it root 551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID INT -> INT ID 552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | INT 553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '(2 1 a)' 559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "subrule with rewrite" do 563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'a 1 2 3' ) 564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar SubruleWithRewrite; 565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {BLOCK;} 567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : b b ; 568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : (ID INT -> INT ID | INT INT -> INT+ ) 569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '1 a 2 3' 576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "subrule with rewrite2" do 580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'int a; int b=3;' ) 581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar SubruleWithRewrite2; 582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {TYPE;} 584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : b b ; 585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : 'int' 586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ( ID -> ^(TYPE 'int' ID) 587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ID '=' INT -> ^(TYPE 'int' ID INT) 588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ';' 590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '(TYPE int a) (TYPE int b 3)' 597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "nested rewrite shuts off auto ast" do 601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'a b c d; 42' ) 602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar NestedRewriteShutsOffAutoAST; 603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {BLOCK;} 605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : b b ; 606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID ( ID (last=ID -> $last)+ ) ';' // get last ID 607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | INT // should still get auto AST construction 608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'd 42' 615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "rewrite actions" do 619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, '3' ) 620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar RewriteActions; 621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : atom -> ^({ @adaptor.create( INT, "9" ) } atom) ; 623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver atom : INT ; 624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '(9 3)' 630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "rewrite actions2" do 634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, '3' ) 635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar RewriteActions2; 636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : atom -> { @adaptor.create( INT, "9" ) } atom ; 638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver atom : INT ; 639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') { $channel = HIDDEN } ; 642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '9 3' 645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "ref to old value" do 649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, '3+4+5' ) 650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar RefToOldValue; 651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {BLOCK;} 653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : (atom -> atom) (op='+' r=atom -> ^($op $a $r) )* ; 654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver atom : INT ; 655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '(+ (+ 3 4) 5)' 661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "copy semantics for rules" do 665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, '3' ) 666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar CopySemanticsForRules; 667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {BLOCK;} 669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : atom -> ^(atom atom) ; // NOT CYCLE! (dup atom) 670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver atom : INT ; 671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '(3 3)' 677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "copy semantics for rules2" do 681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'int a,b,c;' ) 682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar CopySemanticsForRules2; 683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : type ID (',' ID)* ';' -> ^(type ID)+ ; 685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type : 'int' ; 686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '(int a) (int b) (int c)' 691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "copy semantics for rules3" do 695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'public int a,b,c;' ) 696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar CopySemanticsForRules3; 697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : modifier? type ID (',' ID)* ';' -> ^(type modifier? ID)+ ; 699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type : 'int' ; 700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver modifier : 'public' ; 701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '(int public a) (int public b) (int public c)' 706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "copy semantics for rules3 double" do 710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'public int a,b,c;' ) 711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar CopySemanticsForRules3Double; 712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : modifier? type ID (',' ID)* ';' -> ^(type modifier? ID)+ ^(type modifier? ID)+ ; 714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type : 'int' ; 715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver modifier : 'public' ; 716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '(int public a) (int public b) (int public c) (int public a) (int public b) (int public c)' 721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "copy semantics for rules4" do 725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'public int a,b,c;' ) 726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar CopySemanticsForRules4; 727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {MOD;} 729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : modifier? type ID (',' ID)* ';' -> ^(type ^(MOD modifier)? ID)+ ; 730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type : 'int' ; 731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver modifier : 'public' ; 732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '(int (MOD public) a) (int (MOD public) b) (int (MOD public) c)' 737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "copy semantics lists" do 741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'a,b,c;' ) 742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar CopySemanticsLists; 743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {MOD;} 745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID (',' ID)* ';' -> ID+ ID+ ; 746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'a b c a b c' 751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "copy rule label" do 755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'a' ) 756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar CopyRuleLabel; 757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {BLOCK;} 759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : x=b -> $x $x; 760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID ; 761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'a a' 766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "copy rule label2" do 770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'a' ) 771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar CopyRuleLabel2; 772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {BLOCK;} 774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : x=b -> ^($x $x); 775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID ; 776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '(a a)' 781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "queueing of tokens" do 785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'int a,b,c;' ) 786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar QueueingOfTokens; 787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : 'int' ID (',' ID)* ';' -> ^('int' ID+) ; 789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver op : '+'|'-' ; 790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '(int a b c)' 796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "copy of tokens" do 800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'int a;' ) 801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar CopyOfTokens; 802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : 'int' ID ';' -> 'int' ID 'int' ID ; 804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver op : '+'|'-' ; 805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'int a int a' 811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "token copy in loop" do 815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'int a,b,c;' ) 816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar TokenCopyInLoop; 817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : 'int' ID (',' ID)* ';' -> ^('int' ID)+ ; 819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver op : '+'|'-' ; 820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '(int a) (int b) (int c)' 826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "token copy in loop against two others" do 830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'int a:1,b:2,c:3;' ) 831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar TokenCopyInLoopAgainstTwoOthers; 832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : 'int' ID ':' INT (',' ID ':' INT)* ';' -> ^('int' ID INT)+ ; 834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver op : '+'|'-' ; 835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '(int a 1) (int b 2) (int c 3)' 841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "list refd one at a time" do 845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'a b c' ) 846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar ListRefdOneAtATime; 847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID+ -> ID ID ID ; // works if 3 input IDs 849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver op : '+'|'-' ; 850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'a b c' 856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "split list with labels" do 860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'a b c' ) 861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar SplitListWithLabels; 862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {VAR;} 864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : first=ID others+=ID* -> $first VAR $others+ ; 865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver op : '+'|'-' ; 866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'a VAR b c' 872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "complicated melange" do 876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'a a b b b c c c d' ) 877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar ComplicatedMelange; 878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {BLOCK;} 880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : A A b=B B b=B c+=C C c+=C D {s=$D.text} -> A+ B+ C+ D ; 881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type : 'int' | 'float' ; 882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver A : 'a' ; 883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver B : 'b' ; 884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver C : 'c' ; 885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver D : 'd' ; 886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'a a b b b c c c d' 890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "rule label" do 894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'a' ) 895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar RuleLabel; 896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {BLOCK;} 898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : x=b -> $x; 899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID ; 900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'a' 905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "ambiguous rule" do 909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'abc 34' ) 910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar AmbiguousRule; 911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID a -> a | INT ; 913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT: '0'..'9'+ ; 915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '34' 919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "rule list label" do 923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'a b' ) 924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar RuleListLabel; 925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {BLOCK;} 927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : x+=b x+=b -> $x+; 928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID ; 929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'a b' 934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "rule list label2" do 938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'a b' ) 939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar RuleListLabel2; 940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {BLOCK;} 942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : x+=b x+=b -> $x $x*; 943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID ; 944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'a b' 949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "optional" do 953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'a' ) 954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar Optional; 955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {BLOCK;} 957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : x=b (y=b)? -> $x $y?; 958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID ; 959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'a' 964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "optional2" do 968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'a b' ) 969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar Optional2; 970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {BLOCK;} 972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : x=ID (y=b)? -> $x $y?; 973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID ; 974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'a b' 979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "optional3" do 983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'a b' ) 984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar Optional3; 985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {BLOCK;} 987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : x=ID (y=b)? -> ($x $y)?; 988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID ; 989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'a b' 994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "optional4" do 998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'a b' ) 999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar Optional4; 1000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 1001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {BLOCK;} 1002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : x+=ID (y=b)? -> ($x $y)?; 1003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID ; 1004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 1005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 1006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 1007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'a b' 1008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 1009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "optional5" do 1012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'a' ) 1013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar Optional5; 1014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 1015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {BLOCK;} 1016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID -> ID? ; // match an ID to optional ID 1017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID ; 1018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 1019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 1020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 1022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'a' 1023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 1024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1025324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "arbitrary expr type" do 1027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'a b' ) 1028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar ArbitraryExprType; 1029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 1030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {BLOCK;} 1031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : x+=b x+=b -> {ANTLR3::CommonTree.new(nil)}; 1032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID ; 1033324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 1034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 1035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 1037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '' 1038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 1039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "set" do 1042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, '2 a 34 de' ) 1043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar SetT; 1044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 1045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a: (INT|ID)+ -> INT+ ID+ ; 1046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT: '0'..'9'+; 1047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+; 1048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 1049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 1051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '2 34 a de' 1052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 1053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "set2" do 1056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, '2' ) 1057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar Set2; 1058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 1059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a: (INT|ID) -> INT? ID? ; 1060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT: '0'..'9'+; 1061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+; 1062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 1063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 1065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '2' 1066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 1067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "set with label" do 1070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver warn( 'test SetWithLabel officially broken' ) 1071324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #result = parse(<<-'END', :a, '2') 1072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # grammar SetWithLabel; 1073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # options {language=Ruby;output=AST;} 1074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # a : x=(INT|ID) -> $x ; 1075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # INT: '0'..'9'+; 1076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # ID : 'a'..'z'+; 1077324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # WS : (' '|'\n') {$channel=HIDDEN;} ; 1078324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 1079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #END 1080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #result.should == '2' 1081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 1082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "rewrite action" do 1085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :r, '25' ) 1086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar RewriteAction; 1087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 1088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens { FLOAT; } 1089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r 1090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : INT -> { ANTLR3::CommonTree.new( create_token( FLOAT, nil, "#{$INT.text}.0" ) ) } 1091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 1092324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 1093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS: (' ' | '\n' | '\t')+ {$channel = HIDDEN;}; 1094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 1096324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '25.0' 1097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 1098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1099324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "optional subrule without real elements" do 1101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :modulo, 'modulo abc (x y #)' ) 1102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar OptionalSubruleWithoutRealElements; 1103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 1104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {PARMS;} 1105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver modulo 1107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : 'modulo' ID ('(' parms+ ')')? -> ^('modulo' ID ^(PARMS parms+)?) 1108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 1109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parms : '#'|ID; 1110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : ('a'..'z' | 'A'..'Z')+; 1111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 1112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 1114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '(modulo abc (PARMS x y #))' 1115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 1116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "wildcard" do 1119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( <<-'END', :a, 'abc 34' ) 1120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar Wildcard; 1121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 1122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID c=. -> $c; 1123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 1124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 1125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 1126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 1128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '34' 1129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 1130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "extra token in simple decl" do 1133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result, errors = parse( <<-'END', :decl, 'int 34 x=1;', true ) 1134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar ExtraTokenInSimpleDecl; 1135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 1136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {EXPR;} 1137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver decl : type ID '=' INT ';' -> ^(EXPR type ID INT) ; 1138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type : 'int' | 'float' ; 1139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 1140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 1141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 1142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 1144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver errors.should == [ 'line 1:4 extraneous input "34" expecting ID' ] 1145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '(EXPR int x 1)' 1146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 1147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "missing id in simple decl" do 1150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result, errors = parse( <<-'END', :decl, 'int =1;', true ) 1151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar MissingIDInSimpleDecl; 1152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 1153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {EXPR;} 1154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver decl : type ID '=' INT ';' -> ^(EXPR type ID INT) ; 1155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type : 'int' | 'float' ; 1156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 1157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 1158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 1159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 1161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver errors.should == [ 'line 1:4 missing ID at "="' ] 1162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '(EXPR int <missing ID> 1)' 1163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 1164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "missing set in simple decl" do 1167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result, errors = parse( <<-'END', :decl, 'x=1;', true ) 1168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar MissingSetInSimpleDecl; 1169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 1170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {EXPR;} 1171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver decl : type ID '=' INT ';' -> ^(EXPR type ID INT) ; 1172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type : 'int' | 'float' ; 1173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 1174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 1175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 1176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 1178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver errors.should == [ 'line 1:0 mismatched input "x" expecting set nil' ] 1179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '(EXPR <error: x> x 1)' 1180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 1181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "missing token gives error node" do 1184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result, errors = parse( <<-'END', :a, 'abc', true ) 1185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar MissingTokenGivesErrorNode; 1186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 1187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT -> ID INT ; 1188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 1189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 1190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 1191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 1193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver errors.should == [ "line 0:-1 missing INT at \"<EOF>\"" ] 1194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'abc <missing INT>' 1195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #end 1196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 1197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "extra token gives error node" do 1200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result, errors = parse( <<-'END', :a, 'abc ick 34', true ) 1201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar ExtraTokenGivesErrorNode; 1202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 1203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : b c -> b c; 1204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID -> ID ; 1205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver c : INT -> INT ; 1206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 1207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 1208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 1209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 1211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver errors.should == [ 'line 1:4 extraneous input "ick" expecting INT' ] 1212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'abc 34' 1213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 1214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "missing first token gives error node" do 1217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result, errors = parse( <<-'END', :a, '34', true ) 1218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar MissingFirstTokenGivesErrorNode; 1219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 1220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT -> ID INT ; 1221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 1222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 1223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 1224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 1226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver errors.should == [ 'line 1:0 missing ID at "34"' ] 1227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '<missing ID> 34' 1228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 1229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "missing first token gives error node2" do 1232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result, errors = parse( <<-'END', :a, '34', true ) 1233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar MissingFirstTokenGivesErrorNode2; 1234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 1235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : b c -> b c; 1236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID -> ID ; 1237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver c : INT -> INT ; 1238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 1239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 1240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 1241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 1243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver errors.should == [ 'line 1:0 missing ID at "34"' ] 1244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '<missing ID> 34' 1245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 1246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "no viable alt gives error node" do 1249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result, errors = parse( <<-'END', :a, '*', true ) 1250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar NoViableAltGivesErrorNode; 1251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 1252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : b -> b | c -> c; 1253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID -> ID ; 1254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver c : INT -> INT ; 1255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 1256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver S : '*' ; 1257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 1258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 1259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 1261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver errors.should == [ 'line 1:0 no viable alternative at input "*"' ] 1262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '<unexpected: 0 S["*"] @ line 1 col 0 (0..0), resync = *>' 1263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 1264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "cardinality" do 1267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lambda do 1268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parse( <<-'END', :a, "a b 3 4 5" ) 1269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar Cardinality; 1270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 1271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {BLOCK;} 1272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID ID INT INT INT -> (ID INT)+; 1273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 1274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 1275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 1276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 1277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end.should raise_error( ANTLR3::Error::RewriteCardinalityError ) 1278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 1279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "cardinality2" do 1281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lambda do 1282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parse( <<-'END', :a, "a b" ) 1283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar Cardinality2; 1284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 1285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {BLOCK;} 1286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID+ -> ID ID ID ; // only 2 input IDs 1287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver op : '+'|'-' ; 1288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 1289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 1290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 1291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 1292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end.should raise_error( ANTLR3::Error::RewriteCardinalityError ) 1293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 1294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "cardinality3" do 1296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lambda do 1297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parse( <<-'END', :a, "3" ) 1298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar Cardinality3; 1299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 1300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {BLOCK;} 1301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID? INT -> ID INT ; 1302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver op : '+'|'-' ; 1303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 1304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 1305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 1306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 1307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end.should raise_error( ANTLR3::Error::RewriteEmptyStream ) 1308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 1309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "loop cardinality" do 1311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lambda do 1312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parse( <<-'END', :a, "3" ) 1313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar LoopCardinality; 1314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;output=AST;} 1315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID? INT -> ID+ INT ; 1316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver op : '+'|'-' ; 1317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 1318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 1319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 1320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 1321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end.should raise_error( ANTLR3::Error::RewriteEarlyExit ) 1322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 1323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend 1327