001: package nz.ac.massey.take.takeep.editor.tokens;
002:
003: import java.util.LinkedList;
004:
005: import org.eclipse.jface.text.rules.IPredicateRule;
006: import org.eclipse.jface.text.rules.IToken;
007: import org.eclipse.jface.text.rules.RuleBasedPartitionScanner;
008: import org.eclipse.jface.text.rules.Token;
009:
010: import org.eclipse.jface.text.rules.ICharacterScanner;
011: import org.eclipse.jface.text.rules.EndOfLineRule;
012:
013: public class TakePartitionScanner extends RuleBasedPartitionScanner {
014:
015: public enum TAKE_PARTITIONS {
016: TAKE_COMMENT, TAKE_GLOBAL_ANNOTATION, TAKE_LOCAL_ANNOTATION, TAKE_RULE_OR_FACT, TAKE_VAR, TAKE_QUERY, TAKE_EXTERNAL, TAKE_REF, TAKE_AGGREGATION, TAKE_IMPORT
017: }
018:
019: class CompleteLine extends EndOfLineRule {
020:
021: public CompleteLine(String startSequence, IToken token) {
022: super (startSequence, token);
023: // this.setColumnConstraint(0);
024: }
025:
026: @Override
027: protected boolean sequenceDetected(ICharacterScanner scanner,
028: char[] sequence, boolean eofAllowed) {
029:
030: if (sequence == this .fStartSequence) {
031:
032: scanner.unread();
033: scanner.unread();
034: int c = scanner.read();
035: scanner.read();
036: if (c != '\n' && c != '\r') {
037: return false;
038: }
039: }
040:
041: return super
042: .sequenceDetected(scanner, sequence, eofAllowed);
043:
044: }
045:
046: }
047:
048: class StatementRule extends EndOfLineRule {
049: public StatementRule(String startSequence, IToken token) {
050: super (startSequence, token);
051: // TODO Auto-generated constructor stub
052: }
053:
054: private char escapeChar = ' ';
055: private char detectedChar = ':';
056:
057: @Override
058: public IToken evaluate(ICharacterScanner scanner, boolean resume) {
059: // TODO Auto-generated method stub
060: return doEvaluate(scanner, resume);
061: }
062:
063: @Override
064: protected IToken doEvaluate(ICharacterScanner scanner,
065: boolean resume) {
066: if (resume) {
067:
068: if (endSequenceDetected(scanner))
069: return this .fToken;
070:
071: } else {
072:
073: if (sequenceDetected(scanner, this .fStartSequence,
074: false)) {
075: if (endSequenceDetected(scanner))
076: return this .fToken;
077: }
078:
079: }
080:
081: return Token.UNDEFINED;
082: }
083:
084: @Override
085: protected boolean sequenceDetected(ICharacterScanner scanner,
086: char[] sequence, boolean eofAllowed) {
087:
088: if (sequence == this .fStartSequence) {
089:
090: scanner.unread();
091: scanner.unread();
092: int nlc = scanner.read();
093: scanner.read();
094: if (nlc != '\n' && nlc != '\r') {
095: return false;
096: }
097: int c = scanner.read();
098:
099: boolean breakLoop = (c == '\n' || c == '\r')
100: || c == this .escapeChar
101: || c == ICharacterScanner.EOF;
102:
103: int j = 1;
104: while (!breakLoop) {
105:
106: if (c == this .detectedChar) {
107: return true;
108: }
109:
110: j++;
111: c = scanner.read();
112: breakLoop = (c == '\n' || c == '\r')
113: || c == this .escapeChar
114: || c == ICharacterScanner.EOF;
115: }
116:
117: for (int i = 1; i < j; i++)
118: scanner.unread();
119: return false;
120:
121: }
122:
123: return super
124: .sequenceDetected(scanner, sequence, eofAllowed);
125:
126: }
127: }
128:
129: public TakePartitionScanner() {
130: super ();
131: IToken comment = new Token(TAKE_PARTITIONS.TAKE_COMMENT.name());
132: IToken gAnotation = new Token(
133: TAKE_PARTITIONS.TAKE_GLOBAL_ANNOTATION.name());
134: IToken lAnotation = new Token(
135: TAKE_PARTITIONS.TAKE_LOCAL_ANNOTATION.name());
136: IToken query = new Token(TAKE_PARTITIONS.TAKE_QUERY.name());
137: IToken external = new Token(TAKE_PARTITIONS.TAKE_EXTERNAL
138: .name());
139: IToken var = new Token(TAKE_PARTITIONS.TAKE_VAR.name());
140: IToken ref = new Token(TAKE_PARTITIONS.TAKE_REF.name());
141: IToken aggregation = new Token(TAKE_PARTITIONS.TAKE_AGGREGATION
142: .name());
143: IToken importt = new Token(TAKE_PARTITIONS.TAKE_IMPORT.name());
144:
145: IToken statement = new Token(TAKE_PARTITIONS.TAKE_RULE_OR_FACT
146: .name());
147:
148: LinkedList<IPredicateRule> rules = new LinkedList<IPredicateRule>();
149:
150: rules.add(new EndOfLineRule("//", comment));
151:
152: rules.add(new CompleteLine("@@", gAnotation));
153: // rules.add(new EndOfLineRule("@@",gAnotation));
154: rules.add(new CompleteLine("@", lAnotation));
155: // rules.add(new EndOfLineRule("@",lAnotation));
156: rules.add(new CompleteLine("query ", query));
157: rules.add(new CompleteLine("external ", external));
158: rules.add(new CompleteLine("var ", var));
159: rules.add(new CompleteLine("ref ", ref));
160: rules.add(new CompleteLine("aggregation ", aggregation));
161: rules.add(new CompleteLine("import ", importt));
162:
163: rules.add(new StatementRule("bih", statement));
164:
165: setPredicateRules(rules
166: .toArray(new IPredicateRule[rules.size()]));
167:
168: }
169:
170: }
|