Отслеживание состояния в JFlex

Asked
Viewd1401

4

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

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

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 ответов

5

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

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

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

  • Привет, Айман, извини, я только что увидел твой ответ.

    Мне также нравится StackOverflow, поэтому, наверное, я спрашивал, есть ли здесь много сообщества по гибкости / лексированию / парсингу.

    Думаю, мне следовало отправить кросс-пост на jsyntaxpane. Я публиковал там сообщения в прошлом (я там TomPoges). Хорошая работа над JSyntaxPane, кстати.

    Tom Martin22 сентября 2009, 08:11