{...}?
части называются семантическими предикатами и содержат целевой код (Python в вашем случае).Таким образом, это означает, что IsNewlineAtPos(...)
должна быть функцией, определенной в Python со вкусом PlSqlBaseLexer
, точно так же, как есть PlSqlBaseLexer
реализации для C # и Java :
# TODO import ANTLR's runtime classes here
class PlSqlBaseLexer(Lexer):
__init__(self, ...):
# TODO
def IsNewlineAtPos(self, pos):
# TODO
Обычно ANTLR создает из вашей грамматики лексер, который расширяет собственный класс Lexer
ANTLR, но поскольку грамматике PL-SQL требуется немного больший целевой код, к грамматике добавляется следующее:
options {
superClass=PlSqlBaseLexer;
}
, который сообщает ANTLR, что ему нужно создать PlSqlBaseLexer
, который "сидит" между собственной реализацией Lexer
ANTLR и PlSqlLexer
.Таким образом, вместо этого дерева наследования:
Lexer
'- PlSqlLexer
теперь оно становится:
Lexer
'- PlSqlBaseLexer (including the `IsNewlineAtPos` function)
'- PlSqlLexer
Так что на самом деле нет ничего более, чем копирование того, что было сделано для версии Java (или C #).Если посмотреть на реализацию Java:
protected boolean IsNewlineAtPos(int pos)
{
int la = _input.LA(pos);
return la == -1 || la == '\n';
}
в сочетании с предикатом {IsNewlineAtPos(-4)}?
, то предикат будет успешным, когда 4 символа от текущей позиции символа лексера (отсюда и минус 4) равны -1 (ничего /EOF) или символ новой строки.
Также обратите внимание на раздел Usage, важное примечание в README.