Author: kjs
Date: Sun Mar 25 07:42:12 2007
New Revision: 17724
Modified:
trunk/compilers/pirc/src/pirparser.c
Log:
compilers/pirc:
* added support for negative keys
Modified: trunk/compilers/pirc/src/pirparser.c
==============================================================================
--- trunk/compilers/pirc/src/pirparser.c (original)
+++ trunk/compilers/pirc/src/pirparser.c Sun Mar 25 07:42:12 2007
@@ -224,7 +224,7 @@
Parse a simple expression. Returns the type of the expression.
- expression -> IDENT | INTC | NUMC | STRINGC | REG
+ expression -> ( IDENT | INTC | NUMC | STRINGC | REG )
=cut
@@ -232,7 +232,8 @@
static token
expression(parser_state *p) {
token exprtok = T_ERROR;
- switch(p->curtoken) {
+
+ switch (p->curtoken) {
case T_IDENTIFIER:
case T_INTEGER_CONSTANT:
case T_NUMBER_CONSTANT:
@@ -303,26 +304,32 @@
=item key()
- key -> '..' expr
- key -> expr [ '..' [ expr ] ]
+ key -> unop expr | '..' expr | expr [ '..' [ expr ] ]
=cut
*/
static void
-key(parser_state *p) {
- if (p->curtoken == T_DOTDOT) { /* key -> '..' expr */
- next(p);
- expression(p);
- }
- else { /* key -> expr [ '..' [ expr ] ] */
- expression(p);
- if (p->curtoken == T_DOTDOT) {
+key(parser_state *p) {
+ switch (p->curtoken) {
+ case T_MINUS:
+ /*
+ case T_BXOR:
+ case T_NOT:
+ */
+ case T_DOTDOT: /* key -> '..' expr */
next(p);
- if (p->curtoken == T_RBRACKET) return;
- else expression(p);
- }
- }
+ expression(p);
+ break;
+ default: /* key -> expr [ '..' [ expr ] ] */
+ expression(p);
+ if (p->curtoken == T_DOTDOT) {
+ next(p);
+ if (p->curtoken == T_RBRACKET) return;
+ else expression(p);
+ }
+ break;
+ }
}