mirror of
https://github.com/unicode-org/icu.git
synced 2025-04-09 15:27:38 +00:00
Add fwd-rev rule syntax a<>b
X-SVN-Rev: 448
This commit is contained in:
parent
a529ecb267
commit
e78b52c1ee
2 changed files with 68 additions and 4 deletions
|
@ -181,7 +181,7 @@ import java.util.Vector;
|
|||
* <p>Copyright © IBM Corporation 1999. All rights reserved.
|
||||
*
|
||||
* @author Alan Liu
|
||||
* @version $RCSfile: RuleBasedTransliterator.java,v $ $Revision: 1.2 $ $Date: 1999/12/20 19:13:41 $
|
||||
* @version $RCSfile: RuleBasedTransliterator.java,v $ $Revision: 1.3 $ $Date: 1999/12/20 20:25:00 $
|
||||
*/
|
||||
public class RuleBasedTransliterator extends Transliterator {
|
||||
/**
|
||||
|
@ -538,9 +538,14 @@ public class RuleBasedTransliterator extends Transliterator {
|
|||
private static final char VARIABLE_DEF_OP = '=';
|
||||
private static final char FORWARD_RULE_OP = '>';
|
||||
private static final char REVERSE_RULE_OP = '<';
|
||||
private static final char FWDREV_RULE_OP = '~'; // internal rep of FWDREF_OP_STRING
|
||||
|
||||
private static final String OPERATORS = "=><";
|
||||
|
||||
// Forward-Reverse operator
|
||||
// a<>b is equivalent to a<b;a>b
|
||||
private static final String FWDREV_OP_STRING = "<>"; // must have length 2
|
||||
|
||||
// Other special characters
|
||||
private static final char QUOTE = '\'';
|
||||
private static final char VARIABLE_REF_OPEN = '{';
|
||||
|
@ -685,6 +690,13 @@ public class RuleBasedTransliterator extends Transliterator {
|
|||
cursorPos[0]));
|
||||
} // otherwise ignore the rule; it's not the direction we want
|
||||
break;
|
||||
case FWDREV_RULE_OP:
|
||||
data.ruleSet.addRule(new TransliterationRule(
|
||||
direction == FORWARD ? left.toString() : right.toString(),
|
||||
direction == FORWARD ? right.toString() : left.toString(),
|
||||
// Context & cursor disallowed
|
||||
"", "", -1));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -767,6 +779,24 @@ public class RuleBasedTransliterator extends Transliterator {
|
|||
+ rules.substring(start, limit));
|
||||
}
|
||||
char c = rules.charAt(i);
|
||||
|
||||
// Look for "<>" double rules.
|
||||
if ((i+1) < limit && rules.substring(i, i+2).equals(FWDREV_OP_STRING)) {
|
||||
if (i == start) {
|
||||
throw new IllegalArgumentException(
|
||||
"Empty left side: "
|
||||
+ rules.substring(start, limit));
|
||||
}
|
||||
if (i+2 == limit) {
|
||||
throw new IllegalArgumentException(
|
||||
"Empty right side: "
|
||||
+ rules.substring(start, limit));
|
||||
}
|
||||
parseSubPattern(start, i, left, null, SPECIALS);
|
||||
parseSubPattern(i+2, limit, right, null, SPECIALS);
|
||||
return FWDREV_RULE_OP;
|
||||
}
|
||||
|
||||
switch (c) {
|
||||
case FORWARD_RULE_OP:
|
||||
if (i == start) {
|
||||
|
@ -790,7 +820,7 @@ public class RuleBasedTransliterator extends Transliterator {
|
|||
}
|
||||
parseMatchPattern(i+1, limit, right, anteContext, postContext);
|
||||
break;
|
||||
default:
|
||||
case VARIABLE_DEF_OP:
|
||||
if (i == start || i == (limit-1)) {
|
||||
throw new IllegalArgumentException(
|
||||
"Empty left or right side: "
|
||||
|
@ -799,6 +829,8 @@ public class RuleBasedTransliterator extends Transliterator {
|
|||
parseSubPattern(start, i, left);
|
||||
parseDefPattern(i+1, limit, right);
|
||||
break;
|
||||
default:
|
||||
throw new RuntimeException();
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
|
|
@ -181,7 +181,7 @@ import java.util.Vector;
|
|||
* <p>Copyright © IBM Corporation 1999. All rights reserved.
|
||||
*
|
||||
* @author Alan Liu
|
||||
* @version $RCSfile: RuleBasedTransliterator.java,v $ $Revision: 1.2 $ $Date: 1999/12/20 19:13:41 $
|
||||
* @version $RCSfile: RuleBasedTransliterator.java,v $ $Revision: 1.3 $ $Date: 1999/12/20 20:25:00 $
|
||||
*/
|
||||
public class RuleBasedTransliterator extends Transliterator {
|
||||
/**
|
||||
|
@ -538,9 +538,14 @@ public class RuleBasedTransliterator extends Transliterator {
|
|||
private static final char VARIABLE_DEF_OP = '=';
|
||||
private static final char FORWARD_RULE_OP = '>';
|
||||
private static final char REVERSE_RULE_OP = '<';
|
||||
private static final char FWDREV_RULE_OP = '~'; // internal rep of FWDREF_OP_STRING
|
||||
|
||||
private static final String OPERATORS = "=><";
|
||||
|
||||
// Forward-Reverse operator
|
||||
// a<>b is equivalent to a<b;a>b
|
||||
private static final String FWDREV_OP_STRING = "<>"; // must have length 2
|
||||
|
||||
// Other special characters
|
||||
private static final char QUOTE = '\'';
|
||||
private static final char VARIABLE_REF_OPEN = '{';
|
||||
|
@ -685,6 +690,13 @@ public class RuleBasedTransliterator extends Transliterator {
|
|||
cursorPos[0]));
|
||||
} // otherwise ignore the rule; it's not the direction we want
|
||||
break;
|
||||
case FWDREV_RULE_OP:
|
||||
data.ruleSet.addRule(new TransliterationRule(
|
||||
direction == FORWARD ? left.toString() : right.toString(),
|
||||
direction == FORWARD ? right.toString() : left.toString(),
|
||||
// Context & cursor disallowed
|
||||
"", "", -1));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -767,6 +779,24 @@ public class RuleBasedTransliterator extends Transliterator {
|
|||
+ rules.substring(start, limit));
|
||||
}
|
||||
char c = rules.charAt(i);
|
||||
|
||||
// Look for "<>" double rules.
|
||||
if ((i+1) < limit && rules.substring(i, i+2).equals(FWDREV_OP_STRING)) {
|
||||
if (i == start) {
|
||||
throw new IllegalArgumentException(
|
||||
"Empty left side: "
|
||||
+ rules.substring(start, limit));
|
||||
}
|
||||
if (i+2 == limit) {
|
||||
throw new IllegalArgumentException(
|
||||
"Empty right side: "
|
||||
+ rules.substring(start, limit));
|
||||
}
|
||||
parseSubPattern(start, i, left, null, SPECIALS);
|
||||
parseSubPattern(i+2, limit, right, null, SPECIALS);
|
||||
return FWDREV_RULE_OP;
|
||||
}
|
||||
|
||||
switch (c) {
|
||||
case FORWARD_RULE_OP:
|
||||
if (i == start) {
|
||||
|
@ -790,7 +820,7 @@ public class RuleBasedTransliterator extends Transliterator {
|
|||
}
|
||||
parseMatchPattern(i+1, limit, right, anteContext, postContext);
|
||||
break;
|
||||
default:
|
||||
case VARIABLE_DEF_OP:
|
||||
if (i == start || i == (limit-1)) {
|
||||
throw new IllegalArgumentException(
|
||||
"Empty left or right side: "
|
||||
|
@ -799,6 +829,8 @@ public class RuleBasedTransliterator extends Transliterator {
|
|||
parseSubPattern(start, i, left);
|
||||
parseDefPattern(i+1, limit, right);
|
||||
break;
|
||||
default:
|
||||
throw new RuntimeException();
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue