«нечетное» выражение в PL / 0

#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 .