1

给定以下 EBNF 语法(在 PL/0 的 wikipedia 上找到),“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 ")".
4

2 回答 2

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;
于 2011-10-10T08:48:48.307 回答
0

我相信odd类似于一个函数,该函数确定它后面的表达式的值是奇数还是偶数(整数)值,并在值为奇数时返回“真”。在 C 中:

bool odd(int exp) { return (exp & 1) != 0; }
于 2011-10-10T04:31:29.503 回答