+/- знак для префикса номера: лексический / синтаксический элемент? - PullRequest
1 голос
/ 21 октября 2011

Я бы хотел добавить поддержку знака +/- к номеру для моего оценщика выражений, однако я не уверен, должен ли он быть лексическим элементом как часть числового токена (например, number = [\+\-]*[0-9]+) или синтаксическим (например, primary ::= [ ( "+" | "-" ) ] primary | number). где number = [0-9]+).

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

Ответы [ 2 ]

0 голосов
/ 25 октября 2011

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

Если вы производите «-» как отдельную лексему, анализатор может легко решить, является ли он оператором вычитания или оператором отрицания из-за предоставленных вами правил грамматики.

Лексер не может принять это решение, так как у него нет доступа к состоянию анализатора. Так как же он может разумно определить, должен ли символ "-", с которым он только что столкнулся, вызывать генерацию токена "-" или использоваться следующим числовым литералом? Если он используется следующим числовым литералом, то у вашего синтаксического анализатора возникнут проблемы с выражением:

 x - -2

То, что вы, вероятно, хотите, чтобы грамматические правила обрабатывали оба типа знаков минус:

expression = sum ;

sum =  term ;
sum = sum '+' term ;
sum = sum '-' term ;

term = primary ;
term = term '*' primary ;
term = term '/' primary

primary = '-' primary ;
primary = '(' expression ')' ;
primary = number ;
primary = identifier ;

(я позволю вам преобразовать их в любую удобную для вас форму).

0 голосов
/ 21 октября 2011

Я думаю, это хорошо, если вы используете оба: 1 - -1 = 2

...