Предположим, что у нас есть простая грамматическая спецификация. Существует способ перечислить термины этой грамматики, которая гарантирует, что любой конечный член будет иметь конечную позицию, итерации по диагонали. Например, для следующей грамматики:
S ::= add
add ::= mul | add + mul
mul ::= term | mul * term
term ::= number | ( S )
number ::= digit | digit number
digit ::= 0 | 1 | ... | 9
Вы можете перечислить такие термины:
0
1
0+0
0*0
0+1
(0)
1+0
0*1
0+0*0
00
... etc
Мой вопрос: есть ли способ сделать обратное? То есть, чтобы взять действительный термин этой грамматики, скажем, 0+0*0
, и найти ее позицию при таком перечислении - в этом случае 9?