1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
|
// **********************************************************************
//
// Copyright (c) 2003-2009 ZeroC, Inc. All rights reserved.
//
// This copy of Ice is licensed to you under the terms described in the
// ICE_LICENSE file included in this distribution.
//
// **********************************************************************
public class Parser
{
public Complex.Node
parse(String buf)
throws ParseError
{
_buf = buf;
_pos = 0;
_token = null;
return start();
}
private Complex.Node
start()
throws ParseError
{
nextToken();
Complex.Node node = expr();
if(_token != null)
{
throw new ParseError("Extra garbage: " + _token);
}
return node;
}
private Complex.Node
expr()
throws ParseError
{
try
{
if(_token == null)
{
return null;
}
//
// '(' expr ')'
//
if(_token.charAt(0) == '(')
{
nextToken();
Complex.Node node = expr();
if(_token.charAt(0) != ')')
{
throw new ParseError("Expected ')'");
}
nextToken();
return node;
}
//
// expr | expr '+' expr | expr '*' expr
//
if(!Character.isDigit(_token.charAt(0)))
{
throw new ParseError("Expected number");
}
Complex.NumberNode number = new Complex.NumberNodeI(Integer.parseInt(_token));
Complex.Node result = number;
//
// expr?
//
nextToken();
if(_token != null)
{
//
// expr '+' expr
//
if(_token.charAt(0) == '+')
{
nextToken();
Complex.Node right = expr();
result = new Complex.AddNodeI(number, right);
}
//
// expr '*' expr
//
else if(_token.charAt(0) == '*')
{
nextToken();
Complex.Node right = expr();
result = new Complex.MultiplyNodeI(number, right);
}
}
return result;
}
catch(NumberFormatException e)
{
ParseError ex = new ParseError("Error parsing number");
ex.initCause(e);
throw ex;
}
}
private void
nextToken()
{
//
// Eat any whitespace.
//
while(_pos < _buf.length() && Character.isWhitespace(_buf.charAt(_pos)))
{
_pos++;
}
//
// At the end-of-buffer?
//
if(_pos >= _buf.length())
{
_token = null;
return;
}
StringBuilder buf = new StringBuilder(128);
//
// Get the next character
//
char c = _buf.charAt(_pos);
//
// '(', ')', '+' and '*' are tokens.
//
if(c == '(' || c == ')' || c == '+' || c == '*')
{
buf.append(c);
++_pos;
}
else
{
//
// Otherwise it's a number.
//
while(_pos < _buf.length() && Character.isDigit(_buf.charAt(_pos)))
{
buf.append(_buf.charAt(_pos++));
}
}
_token = buf.toString();
}
private String _buf;
private int _pos;
private String _token;
}
|