Числовое выражение регулярного выражения - PullRequest
0 голосов
/ 18 мая 2018

Мне нужно написать регулярное выражение, заданное следующей формой BNF:

<expr_num>:=<var>|<sign>|"("<expr_num>")"|<expr_num><operator_num><expr_num>

Моя попытка:

var=\w*
sign=+|-
operator_num=[+|-|*|/]

Однако, когда я вставляю фразу <expr_num><operator_num><expr_num>,регулярное выражение находится в бесконечной рекурсии из-за <expr_num> в начале.

Моя попытка: (?<expr_num>(?<var>(\[(\w+\d*)\]))|(?<sign>([\+|\-]\g<sign>)|(\d*))|(\((\g<expr_num>)\))|(\g<expr_num>[+|*|-|\/]{1}\g<expr_num>))$

Ошибка: recursive call could loop indefinitely

Как решить эту проблему?Как создать парсер в C # для этого выражения?

1 Ответ

0 голосов
/ 22 мая 2018

Вы можете сделать это в Regex, как показано здесь .Если вам нужно сделать больше, чем просто сопоставить арифметические выражения, например, оценить их, у вас возникнут проблемы с Regex.Если это так, вы должны взять это .В этой статье объясняется, как разобрать выражение и правильно определить приоритет.

...