字符串:
ab/c*efg*h/+d-+
后缀语法:
<postfix> = <identifier> | <postfix><postfix><operator>
<operator> = + | - | * | /
<identifier> = a | b | ... | z
问题:
字符串是否在有效的后缀表达式之上?用GRAMMAR FOR POSTFIX表达式解释。
这不是分级作业。是的,这是一本书。我正在寻找问题的概念性答案,而不一定是代码。我如何查看语法,并为匹配项评估字符串?
答案 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>
。
那是否足够概念化?