}
@Override
public LexerToken getNextToken() throws IOException {
Stream lexer = getCurrentLexer().get(0);
Syntax s = lexer.scan();
while (s.kind() != Syntax.Kind.EOF) {
if (s.kind() == Syntax.Kind.CONDITIONAL) {
Syntax.Conditional c = s.toConditional();
if (c.tag() == Syntax.ConditionalTag.START) {
stack.push(stack.peek().and(translate(c.presenceCondition())));
// System.out.println("#if " + stack.peek());
} else if (c.tag() == Syntax.ConditionalTag.NEXT) {
stack.pop();
stack.push(stack.peek().and(translate(c.presenceCondition())));
// System.out.println("#elif " + stack.peek());
} else {
stack.pop();
// System.out.println("#endif");
}
}
if (s.kind() == Syntax.Kind.CONDITIONAL)
return new XtcToken(s, stack.peek());
Boolean visible = stack.peek().isSatisfiable();
if (visible) {
if (s.kind() == Syntax.Kind.LANGUAGE)
return new XtcToken(s, stack.peek());
if (s.kind() == Syntax.Kind.LAYOUT)
return new XtcToken(s, stack.peek());
}
s = lexer.scan();
}
getCurrentLexer().remove(0);
if (getCurrentLexer().isEmpty())
return new EOFToken();
else