
eu.mihosoft.vmf.vmftext.grammar.antlr4.LexerAdaptor Maven / Gradle / Ivy
The newest version!
/*
* Copyright 2017-2018 Michael Hoffer . All rights reserved.
* Copyright 2017-2018 Goethe Center for Scientific Computing, University Frankfurt. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* If you use this software for scientific research then please cite the following publication(s):
*
* M. Hoffer, C. Poliwoda, & G. Wittum. (2013). Visual reflection library:
* a framework for declarative GUI programming on the Java platform.
* Computing and Visualization in Science, 2013, 16(4),
* 181–192. http://doi.org/10.1007/s00791-014-0230-y
*/
package eu.mihosoft.vmf.vmftext.grammar.antlr4;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.Lexer;
import org.antlr.v4.runtime.Token;
import org.antlr.v4.runtime.misc.Interval;
public abstract class LexerAdaptor extends Lexer {
public LexerAdaptor(CharStream input) {
super(input);
}
/**
* Track whether we are inside of a rule and whether it is lexical parser. _currentRuleType==Token.INVALID_TYPE
* means that we are outside of a rule. At the first sign of a rule name reference and _currentRuleType==invalid, we
* can assume that we are starting a parser rule. Similarly, seeing a token reference when not already in rule means
* starting a token rule. The terminating ';' of a rule, flips this back to invalid type.
*
* This is not perfect logic but works. For example, "grammar T;" means that we start and stop a lexical rule for
* the "T;". Dangerous but works.
*
* The whole point of this state information is to distinguish between [..arg actions..] and [charsets]. Char sets
* can only occur in lexical rules and arg actions cannot occur.
*/
private int _currentRuleType = Token.INVALID_TYPE;
public int getCurrentRuleType() {
return _currentRuleType;
}
public void setCurrentRuleType(int ruleType) {
this._currentRuleType = ruleType;
}
protected void handleBeginArgument() {
if (inLexerRule()) {
pushMode(ANTLRv4Lexer.LexerCharSet);
more();
} else {
pushMode(ANTLRv4Lexer.Argument);
}
}
protected void handleEndArgument() {
popMode();
if (_modeStack.size() > 0) {
setType(ANTLRv4Lexer.ARGUMENT_CONTENT);
}
}
protected void handleEndAction() {
popMode();
if (_modeStack.size() > 0) {
setType(ANTLRv4Lexer.ACTION_CONTENT);
}
}
@Override
public Token emit() {
if (_type == ANTLRv4Lexer.ID) {
String firstChar = _input.getText(Interval.of(_tokenStartCharIndex, _tokenStartCharIndex));
if (Character.isUpperCase(firstChar.charAt(0))) {
_type = ANTLRv4Lexer.TOKEN_REF;
} else {
_type = ANTLRv4Lexer.RULE_REF;
}
if (_currentRuleType == Token.INVALID_TYPE) { // if outside of rule def
_currentRuleType = _type; // set to inside lexer or parser rule
}
} else if (_type == ANTLRv4Lexer.SEMI) { // exit rule def
_currentRuleType = Token.INVALID_TYPE;
}
return super.emit();
}
private boolean inLexerRule() {
return _currentRuleType == ANTLRv4Lexer.TOKEN_REF;
}
@SuppressWarnings("unused")
private boolean inParserRule() { // not used, but added for clarity
return _currentRuleType == ANTLRv4Lexer.RULE_REF;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy