diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/java/org/anarres/cpp/JoinReader.java | 4 | ||||
-rw-r--r-- | src/java/org/anarres/cpp/LexerSource.java | 43 | ||||
-rw-r--r-- | src/java/org/anarres/cpp/Source.java | 8 |
3 files changed, 43 insertions, 12 deletions
diff --git a/src/java/org/anarres/cpp/JoinReader.java b/src/java/org/anarres/cpp/JoinReader.java index 10ec535..298f49d 100644 --- a/src/java/org/anarres/cpp/JoinReader.java +++ b/src/java/org/anarres/cpp/JoinReader.java @@ -46,6 +46,10 @@ import java.io.IOException; this(in, false); } + public void setTrigraphs(boolean enable) { + this.trigraphs = enable; + } + private int __read() throws IOException { if (uptr > 0) return unget[--uptr]; diff --git a/src/java/org/anarres/cpp/LexerSource.java b/src/java/org/anarres/cpp/LexerSource.java index 8561c04..8e679b5 100644 --- a/src/java/org/anarres/cpp/LexerSource.java +++ b/src/java/org/anarres/cpp/LexerSource.java @@ -23,7 +23,8 @@ import java.io.File; import java.io.IOException; import java.io.PushbackReader; import java.io.Reader; -import java.util.Stack; + +import java.util.Set; import static org.anarres.cpp.Token.*; @@ -31,11 +32,14 @@ import static org.anarres.cpp.Token.*; public class LexerSource extends Source { private static final boolean DEBUG = false; + private JoinReader _reader; private PushbackReader reader; private boolean ppvalid; private boolean bol; private boolean include; + private boolean digraphs; + private int line; private int column; private int lastcolumn; @@ -45,11 +49,14 @@ public class LexerSource extends Source { * false in StringLexerSource, * true in FileLexerSource */ public LexerSource(Reader r, boolean ppvalid) { - this.reader = new PushbackReader(new JoinReader(r), 5); + this._reader = new JoinReader(r); + this.reader = new PushbackReader(_reader, 5); this.ppvalid = ppvalid; this.bol = true; this.include = false; + this.digraphs = true; + this.line = 1; this.column = 0; this.lastcolumn = -1; @@ -57,6 +64,13 @@ public class LexerSource extends Source { } @Override + public void setFeatures(Set<Feature> features) { + super.setFeatures(features); + this.digraphs = features.contains(Feature.DIGRAPHS); + this._reader.setTrigraphs(features.contains(Feature.TRIGRAPHS)); + } + + @Override public int getLine() { return line; } @@ -295,13 +309,22 @@ public class LexerSource extends Source { int e = read(); if (e != '\'') { - unread(e); error("Illegal character constant"); - /* XXX We should consume the rest of the line here. */ + /* We consume up to the next ' or the rest of the line. */ + for (;;) { + if (e == '\'') + break; + if (isLineSeparator(e)) { + unread(e); + break; + } + text.append((char)e); + e = read(); + } return new Token(ERROR, text.toString(), null); } text.append('\''); - /* XXX Bad cast. */ + /* XXX It this a bad cast? */ return new Token(CHARACTER, text.toString(), Character.valueOf((char)d)); } @@ -559,9 +582,9 @@ public class LexerSource extends Source { d = read(); if (d == '=') tok = new Token(MOD_EQ); - else if (d == '>') + else if (digraphs && d == '>') tok = new Token('}'); // digraph - else if (d == ':') PASTE: { + else if (digraphs && d == ':') PASTE: { d = read(); if (d != '%') { unread(d); @@ -584,7 +607,7 @@ public class LexerSource extends Source { case ':': /* :: */ d = read(); - if (d == '>') + if (digraphs && d == '>') tok = new Token(']'); // digraph else unread(d); @@ -600,9 +623,9 @@ public class LexerSource extends Source { tok = new Token(LE); else if (d == '<') tok = cond('=', LSH_EQ, LSH); - else if (d == ':') + else if (digraphs && d == ':') tok = new Token('['); // digraph - else if (d == '%') + else if (digraphs && d == '%') tok = new Token('{'); // digraph else unread(d); diff --git a/src/java/org/anarres/cpp/Source.java b/src/java/org/anarres/cpp/Source.java index 7b269b6..0bc1476 100644 --- a/src/java/org/anarres/cpp/Source.java +++ b/src/java/org/anarres/cpp/Source.java @@ -27,8 +27,9 @@ import java.io.PushbackReader; import java.io.Reader; import java.io.StringReader; -import java.util.List; import java.util.Iterator; +import java.util.List; +import java.util.Set; import static org.anarres.cpp.Token.*; @@ -97,10 +98,13 @@ public abstract class Source implements Iterable<Token> { return parent; } - /* pp */ void setListener(PreprocessorListener listener) { + public void setListener(PreprocessorListener listener) { this.listener = listener; } + public void setFeatures(Set<Feature> features) { + } + /** * Returns the File currently being lexed. * |