JFlex: Негативный прогноз в регулярном выражении - PullRequest
0 голосов
/ 27 февраля 2019

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

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

Так что нужно, чтобы числа не ели ., когда за ним следует еще один ., потому что в языке Вольфрама две точки затем анализируются как оператор sigh.

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

Может кто-нибудь сказать мне, как я могу сделать это в 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 Ответ

0 голосов
/ 28 февраля 2019

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

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

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

...