• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * [The "BSD license"]
3  *  Copyright (c) 2010 Terence Parr
4  *  All rights reserved.
5  *
6  *  Redistribution and use in source and binary forms, with or without
7  *  modification, are permitted provided that the following conditions
8  *  are met:
9  *  1. Redistributions of source code must retain the above copyright
10  *      notice, this list of conditions and the following disclaimer.
11  *  2. Redistributions in binary form must reproduce the above copyright
12  *      notice, this list of conditions and the following disclaimer in the
13  *      documentation and/or other materials provided with the distribution.
14  *  3. The name of the author may not be used to endorse or promote products
15  *      derived from this software without specific prior written permission.
16  *
17  *  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18  *  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19  *  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  *  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22  *  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 package org.antlr.tool;
29 
30 import org.antlr.runtime.Token;
31 
32 public class RuleLabelScope extends AttributeScope {
33 	/** Rules have a predefined set of attributes as well as
34 	 *  the return values.  'text' needs to be computed though so.
35 	 */
36 	public static AttributeScope predefinedRulePropertiesScope =
37 		new AttributeScope("RulePredefined",null) {{
38 			addAttribute("text", null);
39 			addAttribute("start", null);
40 			addAttribute("stop", null);
41 			addAttribute("tree", null);
42 			addAttribute("st", null);
43 			isPredefinedRuleScope = true;
44 		}};
45 
46 	public static AttributeScope predefinedTreeRulePropertiesScope =
47 		new AttributeScope("RulePredefined",null) {{
48 			addAttribute("text", null);
49 			addAttribute("start", null); // note: no stop; not meaningful
50 			addAttribute("tree", null);
51 			addAttribute("st", null);
52 			isPredefinedRuleScope = true;
53 		}};
54 
55 	public static AttributeScope predefinedLexerRulePropertiesScope =
56 		new AttributeScope("LexerRulePredefined",null) {{
57 			addAttribute("text", null);
58 			addAttribute("type", null);
59 			addAttribute("line", null);
60 			addAttribute("index", null);
61 			addAttribute("pos", null);
62 			addAttribute("channel", null);
63 			addAttribute("start", null);
64 			addAttribute("stop", null);
65 			addAttribute("int", null);
66 			isPredefinedLexerRuleScope = true;
67 		}};
68 
69 	public static AttributeScope[] grammarTypeToRulePropertiesScope =
70 		{
71 			null,
72 			predefinedLexerRulePropertiesScope,	// LEXER
73 			predefinedRulePropertiesScope,		// PARSER
74 			predefinedTreeRulePropertiesScope,	// TREE_PARSER
75 			predefinedRulePropertiesScope,		// COMBINED
76 		};
77 
78 	public Rule referencedRule;
79 
RuleLabelScope(Rule referencedRule, Token actionToken)80 	public RuleLabelScope(Rule referencedRule, Token actionToken) {
81 		super("ref_"+referencedRule.name,actionToken);
82 		this.referencedRule = referencedRule;
83 	}
84 
85 	/** If you label a rule reference, you can access that rule's
86 	 *  return values as well as any predefined attributes.
87 	 */
getAttribute(String name)88 	public Attribute getAttribute(String name) {
89 		AttributeScope rulePropertiesScope =
90 			RuleLabelScope.grammarTypeToRulePropertiesScope[grammar.type];
91 		if ( rulePropertiesScope.getAttribute(name)!=null ) {
92 			return rulePropertiesScope.getAttribute(name);
93 		}
94 
95 		if ( referencedRule.returnScope!=null ) {
96 			return referencedRule.returnScope.getAttribute(name);
97 		}
98 		return null;
99 	}
100 }
101