blob: dddcb00e93c96f8822d251929b2e95b4e1687051 [file] [log] [blame]
--
-- An instance of this template must have a $Export section and the export_terminals option
--
-- Macros that may be redefined in an instance of this template
--
-- $eof_token
-- $additional_interfaces
-- $super_stream_class -- subclass com.ibm.lpg.LpgLexStream for getKind
-- $prs_stream_class -- use /.PrsStream./ if not subclassing
--
-- B E G I N N I N G O F T E M P L A T E LexerTemplateF
--
%Options programming_language=java,margin=4
%Options table
%options action-block=("*.java", "/.", "./")
%options ParseTable=lpg.runtime.ParseTable
%Options prefix=Char_
--
-- This template requires that the name of the EOF token be set
-- to EOF and that the prefix be "Char_" to be consistent with
-- KeywordTemplateD.
--
%Eof
EOF
%End
--
-- This template also requires that the name of the parser EOF
-- Token to be exported be set to EOF_TOKEN
--
%Export
EOF_TOKEN
%End
%Define
--
-- Macros that are be needed in an instance of this template
--
$eof_token /.$_EOF_TOKEN./
$additional_interfaces /../
$super_stream_class /.$file_prefix$LpgLexStream./
$prs_stream_class /.IPrsStream./
--
-- Some added macros needed by the modified template
--
$lex_stream_class /.LpgLexStream./
$super_lexer_class /.AbstractLexer./
$environment_class /.BasicEnvironment./
$adapt_environment /.environment./
$prs_stream /. // macro prs_stream is deprecated. Use function getPrsStream
getPrsStream()./
$setSym1 /. // macro setSym1 is deprecated. Use function setResult
lexParser.setSym1./
$setResult /. // macro setResult is deprecated. Use function setResult
lexParser.setSym1./
$getSym /. // macro getSym is deprecated. Use function getLastToken
lexParser.getSym./
$getToken /. // macro getToken is deprecated. Use function getToken
lexParser.getToken./
$getLeftSpan /. // macro getLeftSpan is deprecated. Use function getLeftSpan
lexParser.getFirstToken./
$getRightSpan /. // macro getRightSpan is deprecated. Use function getRightSpan
lexParser.getLastToken./
--
-- Macros useful for specifying actions
--
$Header
/.
//
// Rule $rule_number: $rule_text
//
./
$DefaultAction
/.$Header$case $rule_number: { ./
$BeginAction /.$DefaultAction./
$EndAction
/. break;
}./
$BeginJava
/.$BeginAction
$symbol_declarations./
$EndJava /.$EndAction./
$NoAction
/.$Header$case $rule_number:
break; ./
$BeginActions
/.
public void ruleAction(int ruleNumber)
{
switch(ruleNumber)
{./
$SplitActions
/.
default:
ruleAction$rule_number(ruleNumber);
break;
}
return;
}
public void ruleAction$rule_number(int ruleNumber)
{
switch (ruleNumber)
{./
$EndActions
/.
default:
break;
}
return;
}./
%End
%Globals
/.import lpg.runtime.*;
import org.eclipse.ocl.lpg.AbstractLexer;
./
%End
%Headers
/.
@SuppressWarnings("nls")
public class $action_type extends $super_lexer_class implements RuleAction$additional_interfaces
{
private $super_stream_class lexStream;
private static ParseTable prs = new $prs_type();
@Override
public ParseTable getParseTable() { return prs; }
private LexParser lexParser = new LexParser();
@Override
public LexParser getParser() { return lexParser; }
public int getToken(int i) { return lexParser.getToken(i); }
public int getRhsFirstTokenIndex(int i) { return lexParser.getFirstToken(i); }
public int getRhsLastTokenIndex(int i) { return lexParser.getLastToken(i); }
public int getLeftSpan() { return lexParser.getToken(1); }
public int getRightSpan() { return lexParser.getLastToken(); }
@Override
public void resetKeywordLexer()
{
if (kwLexer == null)
this.kwLexer = new $kw_lexer_class(lexStream.getInputChars(), $_IDENTIFIER);
else this.kwLexer.setInputChars(lexStream.getInputChars());
}
@Override
public void reset(char[] input_chars, String filename)
{
reset(input_chars, filename, 1);
}
@Override
public void reset(char[] input_chars, String filename, int tab)
{
lexStream = new $super_stream_class(getOCLEnvironment(), input_chars, filename, tab);
lexParser.reset(lexStream, prs, this);
resetKeywordLexer();
}
public $action_type($environment_class environment) {
super($adapt_environment);
oclEnvironment = environment;
}
public $action_type($environment_class environment, char[] chars) {
this(environment, chars, "OCL", ECLIPSE_TAB_VALUE);
}
public $action_type($environment_class environment, char[] input_chars, String filename, int tab) {
super($adapt_environment);
oclEnvironment = environment;
reset(input_chars, filename, tab);
}
private final $environment_class oclEnvironment;
public $environment_class getOCLEnvironment() {
return oclEnvironment;
}
@Override
public $lex_stream_class getILexStream() { return lexStream; }
/**
* @deprecated replaced by {@link #getILexStream()}
*/
@Deprecated
@Override
public ILexStream getLexStream() { return lexStream; }
private void initializeLexer($prs_stream_class prsStream, int start_offset, int end_offset)
{
if (lexStream.getInputChars() == null)
throw new NullPointerException("LexStream was not initialized");
lexStream.setPrsStream(prsStream);
prsStream.makeToken(start_offset, end_offset, 0); // Token list must start with a bad token
}
private void addEOF($prs_stream_class prsStream, int end_offset)
{
prsStream.makeToken(end_offset, end_offset, $eof_token); // and end with the end of file token
prsStream.setStreamLength(prsStream.getSize());
}
@Override
public void lexer($prs_stream_class prsStream)
{
lexer(null, prsStream);
}
@Override
public void lexer(Monitor monitor, $prs_stream_class prsStream)
{
initializeLexer(prsStream, 0, -1);
lexParser.parseCharacters(monitor); // Lex the input characters
addEOF(prsStream, lexStream.getStreamIndex());
}
@Override
public void lexer($prs_stream_class prsStream, int start_offset, int end_offset)
{
lexer(null, prsStream, start_offset, end_offset);
}
@Override
public void lexer(Monitor monitor, $prs_stream_class prsStream, int start_offset, int end_offset)
{
if (start_offset <= 1)
initializeLexer(prsStream, 0, -1);
else initializeLexer(prsStream, start_offset - 1, start_offset - 1);
lexParser.parseCharacters(monitor, start_offset, end_offset);
addEOF(prsStream, (end_offset >= lexStream.getStreamIndex() ? lexStream.getStreamIndex() : end_offset + 1));
}
/**
* If a parse stream was not passed to this Lexical analyser then we
* simply report a lexical error. Otherwise, we produce a bad token.
*/
@Override
public void reportLexicalError(int startLoc, int endLoc) {
IPrsStream prs_stream = lexStream.getIPrsStream();
if (prs_stream == null)
lexStream.reportLexicalError(startLoc, endLoc);
else {
//
// Remove any token that may have been processed that fall in the
// range of the lexical error... then add one error token that spans
// the error range.
//
for (int i = prs_stream.getSize() - 1; i > 0; i--) {
if (prs_stream.getStartOffset(i) >= startLoc)
prs_stream.removeLastToken();
else break;
}
prs_stream.makeToken(startLoc, endLoc, 0); // add an error token to the prsStream
}
}
./
%End
%Rules
/.$BeginActions./
%End
%Trailers
/.
$EndActions
}
./
%End
--
-- E N D O F T E M P L A T E
--