Simple precedence parser
From Wikipedia, the free encyclopedia
| This article or section needs to be wikified to meet Wikipedia's quality standards. Please help improve this article with relevant internal links. (March 2008) |
In computer science, a Simple precedence parser is a type of bottom-up parser for context-free grammars that can be used only by Simple precedence grammars.
The implementation of the parser is quite similar to the generic bottom-up parser. A stack is used to store a viable prefix of a sentential form from a rightmost derivation. Simbols
,
and
are used to identify the pivot, and to know when to Shift or when to Reduce.
[edit] Implementation
- Compute the Wirth-Weber precedence relationship table.
- Start with a stack with only the starting marker $.
- Start with the string being parsed (Input) ended with an ending marker $.
- While not (Stack equals to $S and Input equals to $) (S = Initial simbol of the grammar)
- Search in the table the relationship between Top(stack) and NextToken(Input)
- if the relationship is
or
- Shift:
- Push(Stack, relationship)
- Push(Stack, NextToken(Input))
- RemoveNextToken(Input)
- if the relationship is
- Reduce:
- SearchProductionToReduce(Stack)
- RemovePivot(Stack)
- Search in the table the relationship between the Non terminal from the production and first symbol in the stack (Starting from top)
- Push(Stack, relationship)
- Push(Stack, Non terminal)
SearchProductionToReduce (Stack)
- search the Pivot in the stack the nearest
from the top - search in the productions of the grammar which one have the same right side than the Pivot
[edit] Example
Given the language: E --> E + T' | T' T' --> T T --> T * F | F F --> ( E' ) | num E' --> E
num is a terminal, and the lexer parse any integer as num.
and the Parsing table:
| E | E' | T | T' | F | + | * | ( | ) | num | $ | |
| E | ![]() |
![]() |
![]() |
||||||||
| E' | ![]() |
||||||||||
| T | ![]() |
![]() |
![]() |
![]() |
|||||||
| T' | ![]() |
![]() |
![]() |
||||||||
| F | ![]() |
![]() |
![]() |
![]() |
|||||||
| + | ![]() |
![]() |
![]() |
![]() |
![]() |
||||||
| * | ![]() |
![]() |
![]() |
||||||||
| ( | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
||||
| ) | ![]() |
![]() |
![]() |
![]() |
|||||||
| num | ![]() |
![]() |
![]() |
![]() |
|||||||
| $ | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
STACK PRECEDENCE INPUT ACTION $ < 2 * ( 1 + 3 )$ SHIFT $ < 2 > * ( 1 + 3 )$ REDUCE (F -> num) $ < F > * ( 1 + 3 )$ REDUCE (T -> F) $ < T = * ( 1 + 3 )$ SHIFT $ < T = * < ( 1 + 3 )$ SHIFT $ < T = * < ( < 1 + 3 )$ SHIFT $ < T = * < ( < 1 > + 3 )$ REDUCE 4 times (F -> num) (T -> F) (T' -> T) (E ->T ') $ < T = * < ( < E = + 3 )$ SHIFT $ < T = * < ( < E = + < 3 )$ SHIFT $ < T = * < ( < E = + < 3 > )$ REDUCE 3 times (F -> num) (T -> F) (T' -> T) $ < T = * < ( < E = + = T > )$ REDUCE 2 times (E -> E + T) (E' -> E) $ < T = * < ( < E' = )$ SHIFT $ < T = * < ( = E' = ) > $ REDUCE (F -> ( E' )) $ < T = * = F > $ REDUCE (T -> T * F) $ < T > $ REDUCE 2 times (T' -> T) (E -> T') $ < E > $ ACCEPT

