blob: 5445212f870d0904fd6a209c11d4d94de9d06de6 [file] [log] [blame]
/* GENERATED SOURCE. DO NOT MODIFY. */
// © 2022 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
package android.icu.message2;
import java.util.Arrays;
/**
* Class generated from EBNF.
*/
@SuppressWarnings("all") // Disable all warnings in the generated file
class Mf2Parser
{
static class ParseException extends RuntimeException
{
private static final long serialVersionUID = 1L;
private int begin, end, offending, expected, state;
public ParseException(int b, int e, int s, int o, int x)
{
begin = b;
end = e;
state = s;
offending = o;
expected = x;
}
@Override
public String getMessage()
{
return offending < 0
? "lexical analysis failed"
: "syntax error";
}
public void serialize(EventHandler eventHandler)
{
}
public int getBegin() {return begin;}
public int getEnd() {return end;}
public int getState() {return state;}
public int getOffending() {return offending;}
public int getExpected() {return expected;}
public boolean isAmbiguousInput() {return false;}
}
/**
* @hide Only a subset of ICU is exposed in Android
*/
public interface EventHandler
{
public void reset(CharSequence string);
public void startNonterminal(String name, int begin);
public void endNonterminal(String name, int end);
public void terminal(String name, int begin, int end);
public void whitespace(int begin, int end);
}
/**
* @hide Only a subset of ICU is exposed in Android
*/
public static class TopDownTreeBuilder implements EventHandler
{
private CharSequence input = null;
public Nonterminal[] stack = new Nonterminal[64];
private int top = -1;
@Override
public void reset(CharSequence input)
{
this.input = input;
top = -1;
}
@Override
public void startNonterminal(String name, int begin)
{
Nonterminal nonterminal = new Nonterminal(name, begin, begin, new Symbol[0]);
if (top >= 0) addChild(nonterminal);
if (++top >= stack.length) stack = Arrays.copyOf(stack, stack.length << 1);
stack[top] = nonterminal;
}
@Override
public void endNonterminal(String name, int end)
{
stack[top].end = end;
if (top > 0) --top;
}
@Override
public void terminal(String name, int begin, int end)
{
addChild(new Terminal(name, begin, end));
}
@Override
public void whitespace(int begin, int end)
{
}
private void addChild(Symbol s)
{
Nonterminal current = stack[top];
current.children = Arrays.copyOf(current.children, current.children.length + 1);
current.children[current.children.length - 1] = s;
}
public void serialize(EventHandler e)
{
e.reset(input);
stack[0].send(e);
}
}
/**
* @hide Only a subset of ICU is exposed in Android
*/
public static abstract class Symbol
{
public String name;
public int begin;
public int end;
protected Symbol(String name, int begin, int end)
{
this.name = name;
this.begin = begin;
this.end = end;
}
public abstract void send(EventHandler e);
}
/**
* @hide Only a subset of ICU is exposed in Android
*/
public static class Terminal extends Symbol
{
public Terminal(String name, int begin, int end)
{
super(name, begin, end);
}
@Override
public void send(EventHandler e)
{
e.terminal(name, begin, end);
}
}
/**
* @hide Only a subset of ICU is exposed in Android
*/
public static class Nonterminal extends Symbol
{
public Symbol[] children;
public Nonterminal(String name, int begin, int end, Symbol[] children)
{
super(name, begin, end);
this.children = children;
}
@Override
public void send(EventHandler e)
{
e.startNonterminal(name, begin);
int pos = begin;
for (Symbol c : children)
{
if (pos < c.begin) e.whitespace(pos, c.begin);
c.send(e);
pos = c.end;
}
if (pos < end) e.whitespace(pos, end);
e.endNonterminal(name, end);
}
}
public Mf2Parser(CharSequence string, EventHandler t)
{
initialize(string, t);
}
public void initialize(CharSequence source, EventHandler parsingEventHandler)
{
eventHandler = parsingEventHandler;
input = source;
size = source.length();
reset(0, 0, 0);
}
public CharSequence getInput()
{
return input;
}
public int getTokenOffset()
{
return b0;
}
public int getTokenEnd()
{
return e0;
}
public final void reset(int l, int b, int e)
{
b0 = b; e0 = b;
l1 = l; b1 = b; e1 = e;
end = e;
eventHandler.reset(input);
}
public void reset()
{
reset(0, 0, 0);
}
public static String getOffendingToken(ParseException e)
{
return e.getOffending() < 0 ? null : TOKEN[e.getOffending()];
}
public static String[] getExpectedTokenSet(ParseException e)
{
String[] expected;
if (e.getExpected() >= 0)
{
expected = new String[]{TOKEN[e.getExpected()]};
}
else
{
expected = getTokenSet(- e.getState());
}
return expected;
}
public String getErrorMessage(ParseException e)
{
String message = e.getMessage();
String[] tokenSet = getExpectedTokenSet(e);
String found = getOffendingToken(e);
int size = e.getEnd() - e.getBegin();
message += (found == null ? "" : ", found " + found)
+ "\nwhile expecting "
+ (tokenSet.length == 1 ? tokenSet[0] : java.util.Arrays.toString(tokenSet))
+ "\n"
+ (size == 0 || found != null ? "" : "after successfully scanning " + size + " characters beginning ");
String prefix = input.subSequence(0, e.getBegin()).toString();
int line = prefix.replaceAll("[^\n]", "").length() + 1;
int column = prefix.length() - prefix.lastIndexOf('\n');
return message
+ "at line " + line + ", column " + column + ":\n..."
+ input.subSequence(e.getBegin(), Math.min(input.length(), e.getBegin() + 64))
+ "...";
}
public void parse_Message()
{
eventHandler.startNonterminal("Message", e0);
for (;;)
{
lookahead1W(12); // WhiteSpace | 'let' | 'match' | '{'
if (l1 != 13) // 'let'
{
break;
}
whitespace();
parse_Declaration();
}
switch (l1)
{
case 16: // '{'
whitespace();
parse_Pattern();
break;
default:
whitespace();
parse_Selector();
for (;;)
{
whitespace();
parse_Variant();
lookahead1W(4); // END | WhiteSpace | 'when'
if (l1 != 15) // 'when'
{
break;
}
}
}
eventHandler.endNonterminal("Message", e0);
}
private void parse_Declaration()
{
eventHandler.startNonterminal("Declaration", e0);
consume(13); // 'let'
lookahead1W(0); // WhiteSpace | Variable
consume(4); // Variable
lookahead1W(1); // WhiteSpace | '='
consume(12); // '='
lookahead1W(2); // WhiteSpace | '{'
consume(16); // '{'
lookahead1W(9); // WhiteSpace | Variable | Function | Literal
whitespace();
parse_Expression();
consume(17); // '}'
eventHandler.endNonterminal("Declaration", e0);
}
private void parse_Selector()
{
eventHandler.startNonterminal("Selector", e0);
consume(14); // 'match'
for (;;)
{
lookahead1W(2); // WhiteSpace | '{'
consume(16); // '{'
lookahead1W(9); // WhiteSpace | Variable | Function | Literal
whitespace();
parse_Expression();
consume(17); // '}'
lookahead1W(7); // WhiteSpace | 'when' | '{'
if (l1 != 16) // '{'
{
break;
}
}
eventHandler.endNonterminal("Selector", e0);
}
private void parse_Variant()
{
eventHandler.startNonterminal("Variant", e0);
consume(15); // 'when'
for (;;)
{
lookahead1W(11); // WhiteSpace | Nmtoken | Literal | '*'
whitespace();
parse_VariantKey();
lookahead1W(13); // WhiteSpace | Nmtoken | Literal | '*' | '{'
if (l1 == 16) // '{'
{
break;
}
}
whitespace();
parse_Pattern();
eventHandler.endNonterminal("Variant", e0);
}
private void parse_VariantKey()
{
eventHandler.startNonterminal("VariantKey", e0);
switch (l1)
{
case 10: // Literal
consume(10); // Literal
break;
case 9: // Nmtoken
consume(9); // Nmtoken
break;
default:
consume(11); // '*'
}
eventHandler.endNonterminal("VariantKey", e0);
}
private void parse_Pattern()
{
eventHandler.startNonterminal("Pattern", e0);
consume(16); // '{'
for (;;)
{
lookahead1(8); // Text | '{' | '}'
if (l1 == 17) // '}'
{
break;
}
switch (l1)
{
case 3: // Text
consume(3); // Text
break;
default:
parse_Placeholder();
}
}
consume(17); // '}'
eventHandler.endNonterminal("Pattern", e0);
}
private void parse_Placeholder()
{
eventHandler.startNonterminal("Placeholder", e0);
consume(16); // '{'
lookahead1W(14); // WhiteSpace | Variable | Function | MarkupStart | MarkupEnd | Literal | '}'
if (l1 != 17) // '}'
{
switch (l1)
{
case 6: // MarkupStart
whitespace();
parse_Markup();
break;
case 7: // MarkupEnd
consume(7); // MarkupEnd
break;
default:
whitespace();
parse_Expression();
}
}
lookahead1W(3); // WhiteSpace | '}'
consume(17); // '}'
eventHandler.endNonterminal("Placeholder", e0);
}
private void parse_Expression()
{
eventHandler.startNonterminal("Expression", e0);
switch (l1)
{
case 5: // Function
parse_Annotation();
break;
default:
parse_Operand();
lookahead1W(5); // WhiteSpace | Function | '}'
if (l1 == 5) // Function
{
whitespace();
parse_Annotation();
}
}
eventHandler.endNonterminal("Expression", e0);
}
private void parse_Operand()
{
eventHandler.startNonterminal("Operand", e0);
switch (l1)
{
case 10: // Literal
consume(10); // Literal
break;
default:
consume(4); // Variable
}
eventHandler.endNonterminal("Operand", e0);
}
private void parse_Annotation()
{
eventHandler.startNonterminal("Annotation", e0);
consume(5); // Function
for (;;)
{
lookahead1W(6); // WhiteSpace | Name | '}'
if (l1 != 8) // Name
{
break;
}
whitespace();
parse_Option();
}
eventHandler.endNonterminal("Annotation", e0);
}
private void parse_Option()
{
eventHandler.startNonterminal("Option", e0);
consume(8); // Name
lookahead1W(1); // WhiteSpace | '='
consume(12); // '='
lookahead1W(10); // WhiteSpace | Variable | Nmtoken | Literal
switch (l1)
{
case 10: // Literal
consume(10); // Literal
break;
case 9: // Nmtoken
consume(9); // Nmtoken
break;
default:
consume(4); // Variable
}
eventHandler.endNonterminal("Option", e0);
}
private void parse_Markup()
{
eventHandler.startNonterminal("Markup", e0);
consume(6); // MarkupStart
for (;;)
{
lookahead1W(6); // WhiteSpace | Name | '}'
if (l1 != 8) // Name
{
break;
}
whitespace();
parse_Option();
}
eventHandler.endNonterminal("Markup", e0);
}
private void consume(int t)
{
if (l1 == t)
{
whitespace();
eventHandler.terminal(TOKEN[l1], b1, e1);
b0 = b1; e0 = e1; l1 = 0;
}
else
{
error(b1, e1, 0, l1, t);
}
}
private void whitespace()
{
if (e0 != b1)
{
eventHandler.whitespace(e0, b1);
e0 = b1;
}
}
private int matchW(int tokenSetId)
{
int code;
for (;;)
{
code = match(tokenSetId);
if (code != 2) // WhiteSpace
{
break;
}
}
return code;
}
private void lookahead1W(int tokenSetId)
{
if (l1 == 0)
{
l1 = matchW(tokenSetId);
b1 = begin;
e1 = end;
}
}
private void lookahead1(int tokenSetId)
{
if (l1 == 0)
{
l1 = match(tokenSetId);
b1 = begin;
e1 = end;
}
}
private int error(int b, int e, int s, int l, int t)
{
throw new ParseException(b, e, s, l, t);
}
private int b0, e0;
private int l1, b1, e1;
private EventHandler eventHandler = null;
private CharSequence input = null;
private int size = 0;
private int begin = 0;
private int end = 0;
private int match(int tokenSetId)
{
begin = end;
int current = end;
int result = INITIAL[tokenSetId];
int state = 0;
for (int code = result & 63; code != 0; )
{
int charclass;
int c0 = current < size ? input.charAt(current) : 0;
++current;
if (c0 < 0x80)
{
charclass = MAP0[c0];
}
else if (c0 < 0xd800)
{
int c1 = c0 >> 4;
charclass = MAP1[(c0 & 15) + MAP1[(c1 & 31) + MAP1[c1 >> 5]]];
}
else
{
if (c0 < 0xdc00)
{
int c1 = current < size ? input.charAt(current) : 0;
if (c1 >= 0xdc00 && c1 < 0xe000)
{
++current;
c0 = ((c0 & 0x3ff) << 10) + (c1 & 0x3ff) + 0x10000;
}
}
int lo = 0, hi = 6;
for (int m = 3; ; m = (hi + lo) >> 1)
{
if (MAP2[m] > c0) {hi = m - 1;}
else if (MAP2[7 + m] < c0) {lo = m + 1;}
else {charclass = MAP2[14 + m]; break;}
if (lo > hi) {charclass = 0; break;}
}
}
state = code;
int i0 = (charclass << 6) + code - 1;
code = TRANSITION[(i0 & 7) + TRANSITION[i0 >> 3]];
if (code > 63)
{
result = code;
code &= 63;
end = current;
}
}
result >>= 6;
if (result == 0)
{
end = current - 1;
int c1 = end < size ? input.charAt(end) : 0;
if (c1 >= 0xdc00 && c1 < 0xe000)
{
--end;
}
return error(begin, end, state, -1, -1);
}
if (end > size) end = size;
return (result & 31) - 1;
}
private static String[] getTokenSet(int tokenSetId)
{
java.util.ArrayList<String> expected = new java.util.ArrayList<>();
int s = tokenSetId < 0 ? - tokenSetId : INITIAL[tokenSetId] & 63;
for (int i = 0; i < 18; i += 32)
{
int j = i;
int i0 = (i >> 5) * 38 + s - 1;
int f = EXPECTED[i0];
for ( ; f != 0; f >>>= 1, ++j)
{
if ((f & 1) != 0)
{
expected.add(TOKEN[j]);
}
}
}
return expected.toArray(new String[]{});
}
private static final int[] MAP0 =
{
/* 0 */ 24, 24, 24, 24, 24, 24, 24, 24, 24, 1, 1, 24, 24, 1, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
/* 27 */ 24, 24, 24, 24, 24, 1, 24, 24, 24, 2, 24, 24, 24, 3, 4, 5, 6, 24, 7, 8, 24, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
/* 58 */ 9, 24, 24, 10, 24, 24, 24, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
/* 85 */ 11, 11, 11, 11, 11, 11, 24, 12, 24, 24, 11, 24, 13, 11, 14, 11, 15, 11, 11, 16, 11, 11, 11, 17, 18, 19,
/* 111 */ 11, 11, 11, 11, 11, 20, 11, 11, 21, 11, 11, 11, 22, 24, 23, 24, 24
};
private static final int[] MAP1 =
{
/* 0 */ 108, 124, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 156, 181, 181, 181, 181,
/* 21 */ 181, 214, 215, 213, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214,
/* 42 */ 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214,
/* 63 */ 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214,
/* 84 */ 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214,
/* 105 */ 214, 214, 214, 383, 330, 396, 353, 291, 262, 247, 308, 330, 330, 330, 322, 292, 284, 292, 284, 292, 292,
/* 126 */ 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 347, 347, 347, 347, 347, 347, 347,
/* 147 */ 277, 292, 292, 292, 292, 292, 292, 292, 292, 369, 330, 330, 331, 329, 330, 330, 292, 292, 292, 292, 292,
/* 168 */ 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 330, 330, 330, 330, 330, 330, 330, 330,
/* 189 */ 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330,
/* 210 */ 330, 330, 330, 291, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292,
/* 231 */ 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 330, 24, 13, 11, 14, 11, 15,
/* 253 */ 11, 11, 16, 11, 11, 11, 17, 18, 19, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 24, 12, 24, 24, 11, 11,
/* 279 */ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 24, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
/* 305 */ 11, 11, 11, 11, 11, 11, 11, 20, 11, 11, 21, 11, 11, 11, 22, 24, 23, 24, 24, 24, 24, 24, 24, 24, 8, 24, 24,
/* 332 */ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
/* 363 */ 9, 24, 24, 10, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 11, 11, 24, 24, 24, 24, 24, 24, 24,
/* 390 */ 24, 24, 1, 1, 24, 24, 1, 24, 24, 24, 2, 24, 24, 24, 3, 4, 5, 6, 24, 7, 8, 24
};
private static final int[] MAP2 =
{
/* 0 */ 55296, 63744, 64976, 65008, 65534, 65536, 983040, 63743, 64975, 65007, 65533, 65535, 983039, 1114111, 24,
/* 15 */ 11, 24, 11, 24, 11, 24
};
private static final int[] INITIAL =
{
/* 0 */ 1, 2, 3, 4, 133, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
};
private static final int[] TRANSITION =
{
/* 0 */ 237, 237, 237, 237, 237, 237, 237, 237, 200, 208, 455, 237, 237, 237, 237, 237, 236, 230, 455, 237, 237,
/* 21 */ 237, 237, 237, 237, 245, 376, 382, 237, 237, 237, 237, 237, 380, 314, 382, 237, 237, 237, 237, 237, 263,
/* 42 */ 455, 237, 237, 237, 237, 237, 237, 295, 455, 237, 237, 237, 237, 237, 237, 322, 287, 281, 252, 237, 237,
/* 63 */ 237, 237, 344, 287, 281, 252, 237, 237, 237, 255, 358, 455, 237, 237, 237, 237, 237, 417, 380, 455, 237,
/* 84 */ 237, 237, 237, 237, 419, 390, 215, 329, 252, 237, 237, 237, 237, 398, 275, 382, 237, 237, 237, 237, 419,
/* 105 */ 390, 215, 410, 252, 237, 237, 237, 419, 390, 215, 329, 309, 237, 237, 237, 419, 390, 222, 365, 252, 237,
/* 126 */ 237, 237, 419, 390, 427, 329, 302, 237, 237, 237, 419, 435, 215, 329, 252, 237, 237, 237, 419, 443, 215,
/* 147 */ 329, 252, 237, 237, 237, 419, 390, 215, 329, 372, 237, 237, 237, 419, 390, 215, 336, 451, 237, 237, 237,
/* 168 */ 402, 390, 215, 329, 252, 237, 237, 237, 350, 463, 269, 237, 237, 237, 237, 237, 474, 471, 269, 237, 237,
/* 189 */ 237, 237, 237, 237, 380, 455, 237, 237, 237, 237, 237, 192, 192, 192, 192, 192, 192, 192, 192, 277, 192,
/* 210 */ 192, 192, 192, 192, 192, 0, 414, 595, 0, 277, 22, 663, 0, 414, 595, 0, 277, 22, 663, 32, 277, 16, 16, 0,
/* 234 */ 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 277, 22, 22, 22, 0, 22, 22, 0, 482, 547, 0, 0, 0, 0, 0, 18, 0, 0, 277,
/* 264 */ 0, 0, 768, 0, 768, 0, 0, 0, 277, 0, 22, 0, 0, 0, 277, 20, 31, 0, 0, 0, 348, 0, 414, 0, 0, 595, 0, 277, 22,
/* 293 */ 663, 0, 277, 0, 0, 0, 0, 0, 26, 0, 482, 547, 0, 0, 960, 0, 0, 482, 547, 0, 38, 0, 0, 0, 0, 277, 704, 0, 0,
/* 322 */ 277, 0, 663, 663, 0, 663, 27, 0, 482, 547, 348, 0, 414, 0, 0, 482, 547, 348, 0, 414, 0, 896, 277, 0, 663,
/* 347 */ 663, 0, 663, 0, 0, 1088, 0, 0, 0, 0, 1088, 277, 18, 0, 0, 0, 0, 18, 0, 482, 547, 348, 36, 414, 0, 0, 482,
/* 374 */ 547, 1024, 0, 0, 0, 0, 277, 0, 0, 0, 0, 0, 0, 0, 22, 0, 277, 0, 663, 663, 0, 663, 0, 348, 20, 0, 0, 0, 0,
/* 403 */ 0, 0, 0, 17, 0, 595, 17, 33, 482, 547, 348, 0, 414, 0, 0, 832, 0, 0, 0, 0, 0, 0, 595, 0, 29, 414, 595, 0,
/* 431 */ 277, 22, 663, 0, 277, 0, 663, 663, 24, 663, 0, 348, 277, 0, 663, 663, 25, 663, 0, 348, 37, 482, 547, 0, 0,
/* 456 */ 0, 0, 0, 277, 22, 0, 0, 1088, 0, 0, 0, 1088, 1088, 0, 0, 1152, 0, 0, 0, 0, 0, 1152, 0, 1152, 1152, 0
};
private static final int[] EXPECTED =
{
/* 0 */ 20, 4100, 65540, 131076, 32772, 131108, 131332, 98308, 196616, 1076, 1556, 3588, 90116, 69124, 132340, 16,
/* 16 */ 32768, 32, 256, 8, 8, 1024, 512, 8192, 16384, 64, 128, 16, 32768, 32, 1024, 8192, 16384, 64, 128, 32768,
/* 36 */ 16384, 16384
};
private static final String[] TOKEN =
{
"(0)",
"END",
"WhiteSpace",
"Text",
"Variable",
"Function",
"MarkupStart",
"MarkupEnd",
"Name",
"Nmtoken",
"Literal",
"'*'",
"'='",
"'let'",
"'match'",
"'when'",
"'{'",
"'}'"
};
}
// End