后缀 - >评估语法(概念)

时间:2013-10-21 00:20:13

标签: grammar postfix-notation

字符串:

ab/c*efg*h/+d-+

后缀语法:

<postfix> = <identifier> | <postfix><postfix><operator>
<operator> = + | - | * | /
<identifier> = a | b | ... | z

问题:

字符串是否在有效的后缀表达式之上?用GRAMMAR FOR POSTFIX表达式解释。


这不是分级作业。是的,这是一本书。我正在寻找问题的概念性答案,而不一定是代码。我如何查看语法,并为匹配项评估字符串?

1 个答案:

答案 0 :(得分:1)

  

如何查看语法,并为匹配项评估字符串?

换句话说,“我如何使用语法解析字符串?”,对吧?

最简单的方法是使用oracular解析器;也就是说,一个解析器可以只查询oracle并决定减少哪个生产。

解析是推导的逆。如果我们可以从起始符号派生字符串,那么我们可以反转该过程以从字符串构造一个解析树。有一个可靠的oracle方便使任何方式都很容易。所以让我们产生最合适的推导。回想一下,在最右边的派生中,它总是最右边的非终端被扩展。

(对于紧凑性,我将非终端表示为大写字母P,O和I.我也右对齐字符串,以便您可以更容易地看到“对应字符”。):

              P   P => P P O
            PPO   O => +
            PP+   P => P P O
          PPPO+   O => -
          PPP-+   P => I
          PPI-+   I => d
          PPd-+   P => P P O
        PPPOd-+   O => +
        PPP+d-+   P => P P O
      PPPPO+d-+   O => /
      PPPP/+d-+   P => I
      PPPI/+d-+   I => h
      PPPh/+d-+   P => P P O
    PPPPOh/+d-+   O => *
    PPPP*h/+d-+   P => I
    PPPI*h/+d-+   I => g
    PPPg*h/+d-+   P => I
    PPIg*h/+d-+   I => f
    PPfg*h/+d-+   P => I
    PIfg*h/+d-+   I => e
    Pefg*h/+d-+   P => P P O
  PPOefg*h/+d-+   O => *
  PP*efg*h/+d-+   P => I
  PI*efg*h/+d-+   I => c
  Pc*efg*h/+d-+   P => P P O
PPOc*efg*h/+d-+   O => /
PP/c*efg*h/+d-+   P => I
PI/c*efg*h/+d-+   I => b
Pb/c*efg*h/+d-+   P => I
Ib/c*efg*h/+d-+   I => a
ab/c*efg*h/+d-+

那么oracle怎么弄清楚要说些什么呢?好吧,如果最右边的非终端是<operator><identifier>,它只需要查看目标字符串的相应字符,看看扩展将是什么。如果最右边的非终端是<postfix>,则有两种可能:<postfix> => <postfix> <postfix> <operator><postfix> => <identifier>。然后,目标字符串的相应字符将与<operator><identifier>非终端对齐,因此很容易知道两个可能的产品中的哪一个能够继续。而这恰恰是我使用一个小的Lua程序作为我的oracle来推导出来的。

现在,如果我们确实需要继续前进,从字符串开始并以单个非终端<postfix>结束会发生什么?好吧,我们只需要改变我们的步骤。如果我们正在查看一封信,我们需要从<identifier>派生,然后立即从<postfix>派生该标识符。如果我们正在查看运算符,我们需要从<operator>派生它,然后立即将最后两个<postfix>加上运算符推导到新的<postfix>

那是否足够概念化?