Я пишу собственный 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, которую я могу использовать, или наилучшая практика, о которой я должен знать?