#grammar #ebnf #oberon
#грамматика #ebnf #оберон
Вопрос:
Учитывая следующую грамматику EBNF (найденную в Википедии для PL / 0), какому выражению предшествует ключевое слово «ODD»? Я хотел бы реализовать простой язык как небольшой проект, но, похоже, я не могу понять, что это значит. Кто-нибудь сталкивался с этим раньше или мог интерпретировать, что такое нечетное выражение, чтобы я мог правильно написать компилятор для языка?
program = block "." .
block = [ "const" ident "=" number {"," ident "=" number} ";"]
[ "var" ident {"," ident} ";"]
{ "procedure" ident ";" block ";" } statement .
statement = [ ident ":=" expression | "call" ident |
"begin" statement {";" statement } "end" |
"if" condition "then" statement |
"while" condition "do" statement ].
condition = "odd" expression |
expression ("="|"#"|"<"|"<="|">"|">=") expression .
expression = [ " "|"-"] term { (" "|"-") term}.
term = factor {("*"|"/") factor}.
factor = ident | number | "(" expression ")".
Ответ №1:
Грамматика EBNF указывает через кавычки, что ODD
является последовательностью символов терминала. Это подтверждается примерами, следующими за грамматикой на странице Википедии. Семантически это похоже на предикат, проверяющий четность числовых значений.
BEGIN
a := x;
b := y;
z := 0;
WHILE b > 0 DO BEGIN
IF ODD b THEN z := z a;
a := 2 * a;
b := b / 2
END
END;
Ответ №2:
Я полагаю, odd
аналогично функции, которая определяет, является ли значение следующего за ним выражения нечетным или четным (целочисленным) значением, и возвращает ‘true’, когда значение нечетное. В C:
bool odd(int exp) { return (exp amp; 1) != 0; }
Комментарии:
1. Или, чаще:
exp % 2 == 0
.