Ik heb een Lemon grammar die er grofweg als volgt uitziet :
en dat parsed zoiets als
Da's een standaard config met aan het eind van de rit een name = value waarde. Wat er gebeurd is dat de name = "value" tokens resulteren in een assignments ::= assignments assignment reduce. Ik dacht dat assignments(X) een constante waarde is, maar dat is niet zo : Een reduce zorgt voor een nieuwe waarde op de parser stack :
de parser trace staat op pastebin. Het resultaat is dat uiteindelijk de laatste assignment wordt gezien in de tree. Op zich kan ik het wel fixen, maar ik zou dit graag net oplossen.
Iemand een briljante suggestie ?
code:
1
2
3
4
5
6
7
8
| start ::= groups. groups ::= groups group. groups ::= group. group(A) ::= IDENTIFIER identparams CURLY_OPEN assignments CURLY_CLOSE SEMICOLON. group(A) ::= IDENTIFIER CURLY_OPEN assignments CURLY_CLOSE SEMICOLON. assignments ::= assignments assignment. assignments ::= assignment. assignment ::= IDENTIFIER ASSIGNMENT bool_expr SEMICOLON. |
en dat parsed zoiets als
code:
1
2
3
4
| name {
name = "value";
name2 = "value";
}; |
Da's een standaard config met aan het eind van de rit een name = value waarde. Wat er gebeurd is dat de name = "value" tokens resulteren in een assignments ::= assignments assignment reduce. Ik dacht dat assignments(X) een constante waarde is, maar dat is niet zo : Een reduce zorgt voor een nieuwe waarde op de parser stack :
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| P assignment(0x807e778) ::= IDENTIFIER(0x807e728) ASSIGNMENT mvalue SEMICOLON. P assignments((nil)) ::= assignments((nil)) assignment(0x807e778). P append 0x807e778 to 0x807e838 P mvalue ::= string. P assignment(0x807e750) ::= IDENTIFIER(0x807e7c8) ASSIGNMENT mvalue SEMICOLON. P assignments((nil)) ::= assignments(0x807e838) assignment(0x807e750). P append 0x807e750 to 0x807e910 P mvalue ::= string. P assignment(0x807e7f0) ::= IDENTIFIER(0x807e7a0) ASSIGNMENT mvalue SEMICOLON. P assignments((nil)) ::= assignments(0x807e910) assignment(0x807e7f0). P append 0x807e7f0 to 0x807e9e8 P group(0x807e7a0) assignments(0x807e9e8) : bind P groups ::= group(0x807e7a0). |
de parser trace staat op pastebin. Het resultaat is dat uiteindelijk de laatste assignment wordt gezien in de tree. Op zich kan ik het wel fixen, maar ik zou dit graag net oplossen.
Iemand een briljante suggestie ?
[ Voor 0% gewijzigd door igmar op 18-05-2013 13:56 . Reden: Kloppende code ]