JFlex: Негативный прогноз в регулярном выражении

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

Определение числа в языке Wolfram Language очень сложно (я добавляю код JFlex в конце), и мне в основном нужны (?!...) оператор в глубоко вложенной конструкции. Тем не менее, JFlex, похоже, поддерживает негативную перспективу только на основе "Правил", что означает, что мне нужно будет расширить свои определения вручную.

Так что хочу, чтобы цифры не ели .когда за ним следует другой .потому что в языке Wolfram Language две точки затем анализируются как вздох оператора.

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

Может кто-нибудь сказать мне, как я могу сделать это в JFlex?

IMG

Вот соответствующий код JFlex и полные определения доступны здесь

Digits = [0-9]+
Digits2 = [0-9a-zA-Z]+
Base = 2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36
Number = {Digits}((\.){Digits}?)? | \.{Digits}
PrecisionNumber = {Number}`((`?){Number})?
BaseNumber = {Base} "^^" {Digits2}(\.{Digits2}?)?
BasePrecisionNumber = {BaseNumber}((`{Number}?)|(``{Number}))
ScientificInteger = {Number} "\*^"(-?){Digits}
ScientificNumber = {PrecisionNumber} "\*^"(-?){Digits}
BaseScientificNumber = {BasePrecisionNumber} "\*^"(-?){Digits}

{BaseScientificNumber}|
{BasePrecisionNumber}|
{ScientificInteger}|
{BaseNumber}|
{ScientificNumber}|
{PrecisionNumber}|
{Number}            { return WLElementTypes.NUMBER; }

1 ответ

Неясно, возможно ли это в вашем случае, но моей первой реакцией на проблему такого рода обычно будет попытка переместить ее на один уровень выше лексера. Т.е. вместо токена лексера NUMBERЯ бы вернул составляющие числа, например {Digits}, ".", "^^"и т. д., а затем соедините их в грамматику синтаксического анализатора (если он есть) или иным образом в механизме синтаксического анализа, который вызывает лексер.

Обычный движок LR или LL на вершине может работать намного лучше с прогнозом и контекстом, т.е. в вашем примере все ниже Base может уже пойти в парсер вместо лексера.

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

Другие вопросы по тегам