January 04, 2005
An oversimplification of the D BNF expression section has expressions threaded. Here is a grossly simplified example:
----------------------------------------------------------------
  Expression:
      AddExpression

  AddExpression:
      MulExpression
      AddExpression + MulExpression
      AddExpression - MulExpression

  MulExpression:
      PrimaryExpression
      MulExpression * UnaryExpression
      MulExpression / UnaryExpression

  PrimaryExpression:
      Identifier
      NumericLiteral
----------------------------------------------------------------
The BNF seems to imply:

  All expressions are AddExpressions
  All AddExpressions are MulExpressions
  All MulExpressions are PrimaryExpressions

Which seems counter-intuitive to me. I am wondering why the recursive definition is used instead of something like this:
----------------------------------------------------------------
  Expression:
      PrimaryExpression
      MulExpression
      AddExpression

  PrimaryExpression:
      Identifier
      NumericLiteral

  MulExpression:
      Expression * Expression
      Expression / Expression

  AddExpression:
      Expression + Expression
      Expression - Expression
----------------------------------------------------------------
The same threaded style BNF is used in the BNF I found for both ANSI C and Java. I would like to understand why the first instead of the second. Thanks!

http://acm.zju.edu.cn/maxiao/major/compile/article/yaccforc.htm
http://www.cs.uiowa.edu/~fleck/JavaBNF.htm
January 04, 2005
> ----------------------------------------------------------------
> The same threaded style BNF is used in the BNF I found for both ANSI C and Java. I would like to understand why the first instead of the second. Thanks!

unambiguous operator precedence. The expression a+b*c must parse as a+(b*c) and not (a+b)*c.