01: /*
02: * xtc - The eXTensible Compiler
03: * Copyright (C) 2004-2007 Robert Grimm
04: *
05: * This library is free software; you can redistribute it and/or
06: * modify it under the terms of the GNU Lesser General Public License
07: * version 2.1 as published by the Free Software Foundation.
08: *
09: * This library is distributed in the hope that it will be useful,
10: * but WITHOUT ANY WARRANTY; without even the implied warranty of
11: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12: * Lesser General Public License for more details.
13: *
14: * You should have received a copy of the GNU Lesser General Public
15: * License along with this library; if not, write to the Free Software
16: * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
17: * USA.
18: */
19: package xtc.parser;
20:
21: /**
22: * A semantic value.
23: *
24: * @author Robert Grimm
25: * @version $Revision: 1.22 $
26: */
27: public final class SemanticValue extends Result {
28:
29: /** The actual value. */
30: public final Object value;
31:
32: /**
33: * The embedded parse error. An embedded parse error is the most
34: * specific parse error encountered during the parse leading to this
35: * semantic value (typically, returned by an unsuccessful option).
36: * It is used to possibly replace a less specific parse error
37: * generated while continuing to parse the input. This field must
38: * not be <code>null</code>; instead, a {@link ParseError#DUMMY
39: * dummy parse error} should be used.
40: */
41: public final ParseError error;
42:
43: /**
44: * Create a new semantic value.
45: *
46: * @param value The value.
47: * @param index The index into the rest of the input.
48: */
49: public SemanticValue(final Object value, final int index) {
50: this (value, index, ParseError.DUMMY);
51: }
52:
53: /**
54: * Create a new semantic value.
55: *
56: * @param value The value.
57: * @param index The index into the rest of the input.
58: * @param error The embedded parse error.
59: */
60: public SemanticValue(final Object value, final int index,
61: final ParseError error) {
62: super (index);
63: this .value = value;
64: this .error = error;
65: }
66:
67: public boolean hasValue() {
68: return true;
69: }
70:
71: public boolean hasValue(final String s) {
72: return s.equals(this .value);
73: }
74:
75: public boolean hasValueIgnoreCase(final String s) {
76: return s.equalsIgnoreCase(this .value.toString());
77: }
78:
79: @SuppressWarnings("unchecked")
80: public <T> T semanticValue() {
81: return (T) value;
82: }
83:
84: public ParseError parseError() {
85: return error;
86: }
87:
88: public ParseError select(final ParseError error) {
89: return (this .error.index < error.index) ? error : this .error;
90: }
91:
92: public SemanticValue createValue(final Object value,
93: final ParseError error) {
94: return (((value == this .value) && (error == this .error)) ? this
95: : new SemanticValue(value, index, error));
96: }
97:
98: }
|