开发者

Making left-most-derivations of a input string. How to predict which production to use from?

开发者 https://www.devze.com 2023-03-10 07:32 出处:网络
Let\'s say I have the following grammar: Expr -> Expr plus Expr(1) |Expr minus Expr (2) |num(3) When doing a left-most-derivation, after \"expanding\" Expr, how should one know what production t

Let's say I have the following grammar:

Expr -> Expr plus Expr  (1)
     |  Expr minus Expr (2)
     |  num             (3)

When doing a left-most-derivation, after "expanding" Expr, how should one know what production to use?

For instance, if I want to pa开发者_如何学运维rse 1 + 2 - 3 I'd start off with:

Expr => Expr minus Expr

but this would only happen because this is a small example and it is easy to see that the (3) would rapidly lead to nowhere and (2) wouldn't fit in the next step. Would the example be a bit more complex and I'd have to make things basically be trial and error. Is this the "right" approach or am I missing something?


Because parsing CFG's is essentially non-deterministic, there is no general way to "know" beforehand which of the possible rules is the correct one. Basically at the simplest level it really is trial and error. Just like a disjunction boolean expression if(a OR b OR c), the individual terms will be evaluated one by one until there is a success, otherwise the rule as a whole fails. So your parser should just start with rule (1), attempt to parse the input and if it fails, restart from that point with rule (2) and so on.

0

精彩评论

暂无评论...
验证码 换一张
取 消