From 6ee196e6800099d52776bb16f84f26525586958f Mon Sep 17 00:00:00 2001 From: Bobby Bingham Date: Wed, 18 Jan 2017 19:10:20 -0600 Subject: nqasm: lex registers as if they were labels This makes parsing registers trickier, but allows a label to have a name 'r0'-'r7', which would otherwise conflict with the registers. --- parser.y | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) (limited to 'parser.y') diff --git a/parser.y b/parser.y index e6cb0b1..f63a70f 100644 --- a/parser.y +++ b/parser.y @@ -78,13 +78,13 @@ void yyerror(const char *msg) %token T_INT %token T_BADINT -%token T_REG -%token T_REGPTR - %token T_COMMA "," %token T_COLON ":" +%token T_DEREF "@" %type inst +%type reg +%type regp %type expr %type a_reg2 %type a_reg3 @@ -150,20 +150,38 @@ inst: ; a_reg2: - T_SPACE T_REG "," T_REG { $$ = MKARGS($2, $4); } + T_SPACE reg "," reg { $$ = MKARGS($2, $4); } a_reg3: - T_SPACE T_REG "," T_REG "," T_REG { $$ = MKARGS($2, $4, $6); } + T_SPACE reg "," reg "," reg { $$ = MKARGS($2, $4, $6); } a_regp: - T_SPACE T_REGPTR { $$ = MKARGS($2); } + T_SPACE regp { $$ = MKARGS($2); } a_regp_reg: - T_SPACE T_REGPTR "," T_REG { $$ = MKARGS($2, $4); } + T_SPACE regp "," reg { $$ = MKARGS($2, $4); } a_reg_regp: - T_SPACE T_REG "," T_REGPTR { $$ = MKARGS($2, $4); } + T_SPACE reg "," regp { $$ = MKARGS($2, $4); } a_reg_expr: - T_SPACE T_REG "," expr { $$ = MKARGS($2, $4); } + T_SPACE reg "," expr { $$ = MKARGS($2, $4); } a_expr: T_SPACE expr { $$ = MKARGS($2); } +regp: "@" reg { $$ = $2; } +reg: T_LABEL { + int bad = 0; + if ($1[0] != 'r' && $1[0] != 'R') + bad = 1; + else if (0 > $1[1] - '0' || $1[1] - '0' > 9) + bad = 1; + else if ($1[2]) + bad = 1; + + if (bad) { + yyerror("invalid register"); + YYERROR; + } else { + $$ = MKARGVALUE($1[1] - '0'); + } + } + expr: intlit { $$ = MKARGVALUE($1); } | T_LABEL { $$ = MKARGLABEL($1); } -- cgit v1.2.3