Отслеживание состояния в JFlex - PullRequest
3 голосов
/ 20 мая 2009

Я пишу собственный flex-файл, чтобы сгенерировать лексер для использования с JSyntaxpane.

Пользовательский язык, который мне нужен для lex, имеет различные состояния, которые могут быть встроены друг в друга в виде стека.

I.E. Вы могли бы написать выражение, содержащее одну строку в кавычках, а затем встроить другое выражение в строку, используя специальный токен eval (). Но вы также можете встроить выражение в строку в двойных кавычках.

например:

someExpressionFunction('a single-quoted string with an eval(expression) embedded in it', "a double-quoted string with an eval(expression) embedded in it")

Это упрощение, есть больше состояний, чем это, но при условии, что мне нужно иметь разные состояния для DOUBLE_STRING и SINGLE_STRING, оно адекватно описывает мою ситуацию.

Каков наилучший способ гарантировать, что я вернусь в правильное состояние после закрытия выражения eval (т.е. вернусь к DOUBLE_STRING, если я был в двойных кавычках, SINGLE_STRING, если я был в одинарных кавычках)

Решение, которое я придумала и которое работает, заключается в отслеживании состояния с использованием стека и некоторых пользовательских методов вместо использования yybegin для запуска другого состояния.

private Stack<Integer> stack = new Stack<Integer>();

public void yypushState(int newState) {
  stack.push(yystate());
  yybegin(newState);
}

public void yypopState() {
  yybegin(stack.pop());
}

Это лучший способ достичь этого? Существует ли более простая встроенная функция JFlex, которую я могу использовать, или наилучшая практика, о которой я должен знать?

1 Ответ

3 голосов
/ 30 июня 2009

Я думаю, что это очень хороший способ сделать это. На самом деле мне нужна была похожая функция для добавления Groovy GString, Python как String и немного HTML в JavaDocs.

Я также хотел бы добавить Lexer, вызывающий Lexer для разбора подразделов. Что-то вроде JavaScript, встроенного в HTML. Но я не мог найти время, чтобы сделать это.

Мне нравится StackOverflow, но мне просто интересно, почему вы не опубликовали это по вопросам JSyntaxPane?

...