]> granicus.if.org Git - yasm/commitdiff
Changed implementation of directives. Added some rudimentary error checking.
authorPeter Johnson <peter@tortall.net>
Sun, 20 May 2001 08:35:18 +0000 (08:35 -0000)
committerPeter Johnson <peter@tortall.net>
Sun, 20 May 2001 08:35:18 +0000 (08:35 -0000)
svn path=/trunk/yasm/; revision=16

modules/parsers/nasm/bison.y.in
modules/parsers/nasm/nasm-bison.y
modules/parsers/nasm/token.l.in
src/bison.y
src/bison.y.in
src/parsers/nasm/bison.y.in
src/parsers/nasm/nasm-bison.y
src/parsers/nasm/token.l.in
src/token.l
src/token.l.in

index edeb7b124cc6f932a91f27341762cf4f1cc91498..f1c045beb417730ee4b18a7e0dcf26c1a45e1e7b 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: bison.y.in,v 1.2 2001/05/18 21:42:31 peter Exp $
+/* $Id: bison.y.in,v 1.3 2001/05/20 08:35:18 peter Exp $
  * Main bison parser
  *
  *  Copyright (C) 2001  Peter Johnson
@@ -25,6 +25,7 @@
 #include "symrec.h"
 #include "globals.h"
 #include "bytecode.h"
+#include "errwarn.h"
 
 #define YYDEBUG 1
 
@@ -36,6 +37,7 @@ extern void yyerror(char *);
 
 %union {
     unsigned long int_val;
+    char *str_val;
     double double_val;
     symrec *sym;
     effaddr ea_val;
@@ -45,7 +47,7 @@ extern void yyerror(char *);
 
 %token <int_val> INTNUM
 %token <double_val> FLTNUM
-%token BITS SECTION ABSOLUTE EXTERN GLOBAL COMMON
+%token <str_val> DIRECTIVE_NAME DIRECTIVE_VAL
 %token <int_val> BYTE WORD DWORD QWORD TWORD DQWORD
 %token <int_val> DECLARE_DATA
 %token <int_val> RESERVE_SPACE
@@ -68,6 +70,7 @@ extern void yyerror(char *);
 %type <bc> aaa aad idiv imul in loopz lsl
 
 %type <bc> line exp instr instrbase
+
 %type <int_val> fpureg reg32 reg16 reg8 reg_dess reg_fsgs reg_notcs
 %type <ea_val> mem memaddr memexp
 %type <ea_val> mem8x mem16x mem32x mem64x mem80x mem128x
@@ -86,6 +89,7 @@ input: /* empty */
 
 line: '\n'     { $$.len = 0; line_number++; }
     | exp '\n' { DebugPrintBC(&$1); $$ = $1; line_number++; }
+    | directive '\n' { line_number++; }
     | error '\n' { yyerrok; line_number++; }
 ;
 
@@ -93,25 +97,16 @@ exp: instr
 ;
 
 /* directives */
-directive: bits
-    | section
-    | absolute
-    | extern
-    | global
-    | common
-;
-
-bits: '[' BITS INTNUM ']'   { }
-;
-section: '[' SECTION ']'    { }
-;
-absolute: '[' ABSOLUTE INTNUM ']'   { }
-;
-extern: '[' EXTERN ']'     { }
-;
-global: '[' GLOBAL ']'     { }
-;
-common: '[' COMMON ']'     { }
+directive: '[' DIRECTIVE_NAME DIRECTIVE_VAL ']' {
+       printf("Directive: Name='%s' Value='%s'\n", $2, $3);
+    }
+    | '[' DIRECTIVE_NAME DIRECTIVE_VAL error {
+       /*Error(ERR_MISSING, "%c", ']');*/
+       fprintf(stderr, "missing ']'\n");
+    }
+    | '[' DIRECTIVE_NAME error {
+       Error(ERR_MISSING_ARG, (char *)NULL, $2);
+    }
 ;
 
 /* register groupings */
index 3416da0a780f992d69a929555842b5150ae58166..8a983ddb6f1477e72966d9f1354710fc75b2abc2 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: nasm-bison.y,v 1.2 2001/05/18 21:42:31 peter Exp $
+/* $Id: nasm-bison.y,v 1.3 2001/05/20 08:35:18 peter Exp $
  * Main bison parser
  *
  *  Copyright (C) 2001  Peter Johnson
@@ -25,6 +25,7 @@
 #include "symrec.h"
 #include "globals.h"
 #include "bytecode.h"
+#include "errwarn.h"
 
 #define YYDEBUG 1
 
@@ -36,6 +37,7 @@ extern void yyerror(char *);
 
 %union {
     unsigned long int_val;
+    char *str_val;
     double double_val;
     symrec *sym;
     effaddr ea_val;
@@ -45,7 +47,7 @@ extern void yyerror(char *);
 
 %token <int_val> INTNUM
 %token <double_val> FLTNUM
-%token BITS SECTION ABSOLUTE EXTERN GLOBAL COMMON
+%token <str_val> DIRECTIVE_NAME DIRECTIVE_VAL
 %token <int_val> BYTE WORD DWORD QWORD TWORD DQWORD
 %token <int_val> DECLARE_DATA
 %token <int_val> RESERVE_SPACE
@@ -68,6 +70,7 @@ extern void yyerror(char *);
 %type <bc> aaa aad idiv imul in loopz lsl
 
 %type <bc> line exp instr instrbase
+
 %type <int_val> fpureg reg32 reg16 reg8 reg_dess reg_fsgs reg_notcs
 %type <ea_val> mem memaddr memexp
 %type <ea_val> mem8x mem16x mem32x mem64x mem80x mem128x
@@ -86,6 +89,7 @@ input: /* empty */
 
 line: '\n'     { $$.len = 0; line_number++; }
     | exp '\n' { DebugPrintBC(&$1); $$ = $1; line_number++; }
+    | directive '\n' { line_number++; }
     | error '\n' { yyerrok; line_number++; }
 ;
 
@@ -93,25 +97,16 @@ exp: instr
 ;
 
 /* directives */
-directive: bits
-    | section
-    | absolute
-    | extern
-    | global
-    | common
-;
-
-bits: '[' BITS INTNUM ']'   { }
-;
-section: '[' SECTION ']'    { }
-;
-absolute: '[' ABSOLUTE INTNUM ']'   { }
-;
-extern: '[' EXTERN ']'     { }
-;
-global: '[' GLOBAL ']'     { }
-;
-common: '[' COMMON ']'     { }
+directive: '[' DIRECTIVE_NAME DIRECTIVE_VAL ']' {
+       printf("Directive: Name='%s' Value='%s'\n", $2, $3);
+    }
+    | '[' DIRECTIVE_NAME DIRECTIVE_VAL error {
+       /*Error(ERR_MISSING, "%c", ']');*/
+       fprintf(stderr, "missing ']'\n");
+    }
+    | '[' DIRECTIVE_NAME error {
+       Error(ERR_MISSING_ARG, (char *)NULL, $2);
+    }
 ;
 
 /* register groupings */
index b108c50fa796ec6712d2b7bc1bf3b933ebab3885..cafa6ba94c7dec7c9317d95bc057f908864b7586 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: token.l.in,v 1.1 2001/05/15 05:20:39 peter Exp $
+/* $Id: token.l.in,v 1.2 2001/05/20 08:35:18 peter Exp $
  * Main lexer
  *
  *  Copyright (C) 2001  Peter Johnson
 #include <string.h>
 #include "symrec.h"
 #include "bytecode.h"
+#include "errwarn.h"
 #include "bison.tab.h"
+
 %}
 %option noyywrap
 %option nounput
 %option case-insensitive
     static char *locallabel_base = (char *)NULL;
 
+%x DIRECTIVE DIRECTIVE2
+
 DIGIT    [0-9]
 BINDIGIT [01]
 OCTDIGIT [0-7]
@@ -74,14 +78,34 @@ WS       [ \t\r]
     yylval.double_val = strtod(yytext, (char **)NULL);
     return FLTNUM;
 }
-    /* directives */
-bits       { return BITS; }
-section            { return SECTION; }
-segment            { return SECTION; }
-absolute    { return ABSOLUTE; }
-extern     { return EXTERN; }
-global     { return GLOBAL; }
-common     { return COMMON; }
+    /* directive: [name value] */
+^"["   { BEGIN DIRECTIVE; return '['; }
+<DIRECTIVE>"]"     { BEGIN INITIAL; return ']'; }
+<DIRECTIVE2>"]"            { BEGIN INITIAL; return ']'; }
+<DIRECTIVE>\n      { BEGIN INITIAL; return '\n'; }
+<DIRECTIVE2>\n     { BEGIN INITIAL; return '\n'; }
+<DIRECTIVE>{WS}+    ;
+<DIRECTIVE2>{WS}+   ;
+<DIRECTIVE>[a-z]+   {
+    BEGIN DIRECTIVE2;
+    yylval.str_val = strdup(yytext);
+    if(!yylval.str_val)
+       Fatal(FATAL_NOMEM);
+    return DIRECTIVE_NAME;
+}
+    /* everything printable except for ' ', '[' and ']'. */
+<DIRECTIVE2>[!-Z\^-~]+ {
+    yylval.str_val = strdup(yytext);
+    if(!yylval.str_val)
+       Fatal(FATAL_NOMEM);
+    return DIRECTIVE_VAL;
+}
+<DIRECTIVE>. {
+    Warning(WARN_UNREC_CHAR, (char *)NULL, conv_unprint(yytext[0]));
+}
+<DIRECTIVE2>. {
+    Warning(WARN_UNREC_CHAR, (char *)NULL, conv_unprint(yytext[0]));
+}
 
     /* size specifiers */
 byte   { yylval.int_val = 1; return BYTE; }
@@ -233,6 +257,8 @@ lsl { return INS_LSL; }
     if(locallabel_base)
        free(locallabel_base);
     locallabel_base = strdup(yytext);
+    if(!locallabel_base)
+       Fatal(FATAL_NOMEM);
 
     return s->type;
 }
@@ -241,5 +267,7 @@ lsl { return INS_LSL; }
 
 {WS}+  ;
 
-\n return '\n';
+\n     return '\n';
+
+.      { Warning(WARN_UNREC_CHAR, (char *)NULL, conv_unprint(yytext[0])); }
 
index 16b7157c448014c040ba54928c39fcbffb20ba86..84de4e8d841624160c0d296ab310f45f6c22a721 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: bison.y,v 1.2 2001/05/18 21:42:31 peter Exp $
+/* $Id: bison.y,v 1.3 2001/05/20 08:35:18 peter Exp $
  * Main bison parser
  *
  *  Copyright (C) 2001  Peter Johnson
@@ -25,6 +25,7 @@
 #include "symrec.h"
 #include "globals.h"
 #include "bytecode.h"
+#include "errwarn.h"
 
 #define YYDEBUG 1
 
@@ -36,6 +37,7 @@ extern void yyerror(char *);
 
 %union {
     unsigned long int_val;
+    char *str_val;
     double double_val;
     symrec *sym;
     effaddr ea_val;
@@ -45,7 +47,7 @@ extern void yyerror(char *);
 
 %token <int_val> INTNUM
 %token <double_val> FLTNUM
-%token BITS SECTION ABSOLUTE EXTERN GLOBAL COMMON
+%token <str_val> DIRECTIVE_NAME DIRECTIVE_VAL
 %token <int_val> BYTE WORD DWORD QWORD TWORD DQWORD
 %token <int_val> DECLARE_DATA
 %token <int_val> RESERVE_SPACE
@@ -68,6 +70,7 @@ extern void yyerror(char *);
 %type <bc> aaa aad idiv imul in loopz lsl
 
 %type <bc> line exp instr instrbase
+
 %type <int_val> fpureg reg32 reg16 reg8 reg_dess reg_fsgs reg_notcs
 %type <ea_val> mem memaddr memexp
 %type <ea_val> mem8x mem16x mem32x mem64x mem80x mem128x
@@ -86,6 +89,7 @@ input: /* empty */
 
 line: '\n'     { $$.len = 0; line_number++; }
     | exp '\n' { DebugPrintBC(&$1); $$ = $1; line_number++; }
+    | directive '\n' { line_number++; }
     | error '\n' { yyerrok; line_number++; }
 ;
 
@@ -93,25 +97,16 @@ exp: instr
 ;
 
 /* directives */
-directive: bits
-    | section
-    | absolute
-    | extern
-    | global
-    | common
-;
-
-bits: '[' BITS INTNUM ']'   { }
-;
-section: '[' SECTION ']'    { }
-;
-absolute: '[' ABSOLUTE INTNUM ']'   { }
-;
-extern: '[' EXTERN ']'     { }
-;
-global: '[' GLOBAL ']'     { }
-;
-common: '[' COMMON ']'     { }
+directive: '[' DIRECTIVE_NAME DIRECTIVE_VAL ']' {
+       printf("Directive: Name='%s' Value='%s'\n", $2, $3);
+    }
+    | '[' DIRECTIVE_NAME DIRECTIVE_VAL error {
+       /*Error(ERR_MISSING, "%c", ']');*/
+       fprintf(stderr, "missing ']'\n");
+    }
+    | '[' DIRECTIVE_NAME error {
+       Error(ERR_MISSING_ARG, (char *)NULL, $2);
+    }
 ;
 
 /* register groupings */
index edeb7b124cc6f932a91f27341762cf4f1cc91498..f1c045beb417730ee4b18a7e0dcf26c1a45e1e7b 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: bison.y.in,v 1.2 2001/05/18 21:42:31 peter Exp $
+/* $Id: bison.y.in,v 1.3 2001/05/20 08:35:18 peter Exp $
  * Main bison parser
  *
  *  Copyright (C) 2001  Peter Johnson
@@ -25,6 +25,7 @@
 #include "symrec.h"
 #include "globals.h"
 #include "bytecode.h"
+#include "errwarn.h"
 
 #define YYDEBUG 1
 
@@ -36,6 +37,7 @@ extern void yyerror(char *);
 
 %union {
     unsigned long int_val;
+    char *str_val;
     double double_val;
     symrec *sym;
     effaddr ea_val;
@@ -45,7 +47,7 @@ extern void yyerror(char *);
 
 %token <int_val> INTNUM
 %token <double_val> FLTNUM
-%token BITS SECTION ABSOLUTE EXTERN GLOBAL COMMON
+%token <str_val> DIRECTIVE_NAME DIRECTIVE_VAL
 %token <int_val> BYTE WORD DWORD QWORD TWORD DQWORD
 %token <int_val> DECLARE_DATA
 %token <int_val> RESERVE_SPACE
@@ -68,6 +70,7 @@ extern void yyerror(char *);
 %type <bc> aaa aad idiv imul in loopz lsl
 
 %type <bc> line exp instr instrbase
+
 %type <int_val> fpureg reg32 reg16 reg8 reg_dess reg_fsgs reg_notcs
 %type <ea_val> mem memaddr memexp
 %type <ea_val> mem8x mem16x mem32x mem64x mem80x mem128x
@@ -86,6 +89,7 @@ input: /* empty */
 
 line: '\n'     { $$.len = 0; line_number++; }
     | exp '\n' { DebugPrintBC(&$1); $$ = $1; line_number++; }
+    | directive '\n' { line_number++; }
     | error '\n' { yyerrok; line_number++; }
 ;
 
@@ -93,25 +97,16 @@ exp: instr
 ;
 
 /* directives */
-directive: bits
-    | section
-    | absolute
-    | extern
-    | global
-    | common
-;
-
-bits: '[' BITS INTNUM ']'   { }
-;
-section: '[' SECTION ']'    { }
-;
-absolute: '[' ABSOLUTE INTNUM ']'   { }
-;
-extern: '[' EXTERN ']'     { }
-;
-global: '[' GLOBAL ']'     { }
-;
-common: '[' COMMON ']'     { }
+directive: '[' DIRECTIVE_NAME DIRECTIVE_VAL ']' {
+       printf("Directive: Name='%s' Value='%s'\n", $2, $3);
+    }
+    | '[' DIRECTIVE_NAME DIRECTIVE_VAL error {
+       /*Error(ERR_MISSING, "%c", ']');*/
+       fprintf(stderr, "missing ']'\n");
+    }
+    | '[' DIRECTIVE_NAME error {
+       Error(ERR_MISSING_ARG, (char *)NULL, $2);
+    }
 ;
 
 /* register groupings */
index edeb7b124cc6f932a91f27341762cf4f1cc91498..f1c045beb417730ee4b18a7e0dcf26c1a45e1e7b 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: bison.y.in,v 1.2 2001/05/18 21:42:31 peter Exp $
+/* $Id: bison.y.in,v 1.3 2001/05/20 08:35:18 peter Exp $
  * Main bison parser
  *
  *  Copyright (C) 2001  Peter Johnson
@@ -25,6 +25,7 @@
 #include "symrec.h"
 #include "globals.h"
 #include "bytecode.h"
+#include "errwarn.h"
 
 #define YYDEBUG 1
 
@@ -36,6 +37,7 @@ extern void yyerror(char *);
 
 %union {
     unsigned long int_val;
+    char *str_val;
     double double_val;
     symrec *sym;
     effaddr ea_val;
@@ -45,7 +47,7 @@ extern void yyerror(char *);
 
 %token <int_val> INTNUM
 %token <double_val> FLTNUM
-%token BITS SECTION ABSOLUTE EXTERN GLOBAL COMMON
+%token <str_val> DIRECTIVE_NAME DIRECTIVE_VAL
 %token <int_val> BYTE WORD DWORD QWORD TWORD DQWORD
 %token <int_val> DECLARE_DATA
 %token <int_val> RESERVE_SPACE
@@ -68,6 +70,7 @@ extern void yyerror(char *);
 %type <bc> aaa aad idiv imul in loopz lsl
 
 %type <bc> line exp instr instrbase
+
 %type <int_val> fpureg reg32 reg16 reg8 reg_dess reg_fsgs reg_notcs
 %type <ea_val> mem memaddr memexp
 %type <ea_val> mem8x mem16x mem32x mem64x mem80x mem128x
@@ -86,6 +89,7 @@ input: /* empty */
 
 line: '\n'     { $$.len = 0; line_number++; }
     | exp '\n' { DebugPrintBC(&$1); $$ = $1; line_number++; }
+    | directive '\n' { line_number++; }
     | error '\n' { yyerrok; line_number++; }
 ;
 
@@ -93,25 +97,16 @@ exp: instr
 ;
 
 /* directives */
-directive: bits
-    | section
-    | absolute
-    | extern
-    | global
-    | common
-;
-
-bits: '[' BITS INTNUM ']'   { }
-;
-section: '[' SECTION ']'    { }
-;
-absolute: '[' ABSOLUTE INTNUM ']'   { }
-;
-extern: '[' EXTERN ']'     { }
-;
-global: '[' GLOBAL ']'     { }
-;
-common: '[' COMMON ']'     { }
+directive: '[' DIRECTIVE_NAME DIRECTIVE_VAL ']' {
+       printf("Directive: Name='%s' Value='%s'\n", $2, $3);
+    }
+    | '[' DIRECTIVE_NAME DIRECTIVE_VAL error {
+       /*Error(ERR_MISSING, "%c", ']');*/
+       fprintf(stderr, "missing ']'\n");
+    }
+    | '[' DIRECTIVE_NAME error {
+       Error(ERR_MISSING_ARG, (char *)NULL, $2);
+    }
 ;
 
 /* register groupings */
index 3416da0a780f992d69a929555842b5150ae58166..8a983ddb6f1477e72966d9f1354710fc75b2abc2 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: nasm-bison.y,v 1.2 2001/05/18 21:42:31 peter Exp $
+/* $Id: nasm-bison.y,v 1.3 2001/05/20 08:35:18 peter Exp $
  * Main bison parser
  *
  *  Copyright (C) 2001  Peter Johnson
@@ -25,6 +25,7 @@
 #include "symrec.h"
 #include "globals.h"
 #include "bytecode.h"
+#include "errwarn.h"
 
 #define YYDEBUG 1
 
@@ -36,6 +37,7 @@ extern void yyerror(char *);
 
 %union {
     unsigned long int_val;
+    char *str_val;
     double double_val;
     symrec *sym;
     effaddr ea_val;
@@ -45,7 +47,7 @@ extern void yyerror(char *);
 
 %token <int_val> INTNUM
 %token <double_val> FLTNUM
-%token BITS SECTION ABSOLUTE EXTERN GLOBAL COMMON
+%token <str_val> DIRECTIVE_NAME DIRECTIVE_VAL
 %token <int_val> BYTE WORD DWORD QWORD TWORD DQWORD
 %token <int_val> DECLARE_DATA
 %token <int_val> RESERVE_SPACE
@@ -68,6 +70,7 @@ extern void yyerror(char *);
 %type <bc> aaa aad idiv imul in loopz lsl
 
 %type <bc> line exp instr instrbase
+
 %type <int_val> fpureg reg32 reg16 reg8 reg_dess reg_fsgs reg_notcs
 %type <ea_val> mem memaddr memexp
 %type <ea_val> mem8x mem16x mem32x mem64x mem80x mem128x
@@ -86,6 +89,7 @@ input: /* empty */
 
 line: '\n'     { $$.len = 0; line_number++; }
     | exp '\n' { DebugPrintBC(&$1); $$ = $1; line_number++; }
+    | directive '\n' { line_number++; }
     | error '\n' { yyerrok; line_number++; }
 ;
 
@@ -93,25 +97,16 @@ exp: instr
 ;
 
 /* directives */
-directive: bits
-    | section
-    | absolute
-    | extern
-    | global
-    | common
-;
-
-bits: '[' BITS INTNUM ']'   { }
-;
-section: '[' SECTION ']'    { }
-;
-absolute: '[' ABSOLUTE INTNUM ']'   { }
-;
-extern: '[' EXTERN ']'     { }
-;
-global: '[' GLOBAL ']'     { }
-;
-common: '[' COMMON ']'     { }
+directive: '[' DIRECTIVE_NAME DIRECTIVE_VAL ']' {
+       printf("Directive: Name='%s' Value='%s'\n", $2, $3);
+    }
+    | '[' DIRECTIVE_NAME DIRECTIVE_VAL error {
+       /*Error(ERR_MISSING, "%c", ']');*/
+       fprintf(stderr, "missing ']'\n");
+    }
+    | '[' DIRECTIVE_NAME error {
+       Error(ERR_MISSING_ARG, (char *)NULL, $2);
+    }
 ;
 
 /* register groupings */
index b108c50fa796ec6712d2b7bc1bf3b933ebab3885..cafa6ba94c7dec7c9317d95bc057f908864b7586 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: token.l.in,v 1.1 2001/05/15 05:20:39 peter Exp $
+/* $Id: token.l.in,v 1.2 2001/05/20 08:35:18 peter Exp $
  * Main lexer
  *
  *  Copyright (C) 2001  Peter Johnson
 #include <string.h>
 #include "symrec.h"
 #include "bytecode.h"
+#include "errwarn.h"
 #include "bison.tab.h"
+
 %}
 %option noyywrap
 %option nounput
 %option case-insensitive
     static char *locallabel_base = (char *)NULL;
 
+%x DIRECTIVE DIRECTIVE2
+
 DIGIT    [0-9]
 BINDIGIT [01]
 OCTDIGIT [0-7]
@@ -74,14 +78,34 @@ WS       [ \t\r]
     yylval.double_val = strtod(yytext, (char **)NULL);
     return FLTNUM;
 }
-    /* directives */
-bits       { return BITS; }
-section            { return SECTION; }
-segment            { return SECTION; }
-absolute    { return ABSOLUTE; }
-extern     { return EXTERN; }
-global     { return GLOBAL; }
-common     { return COMMON; }
+    /* directive: [name value] */
+^"["   { BEGIN DIRECTIVE; return '['; }
+<DIRECTIVE>"]"     { BEGIN INITIAL; return ']'; }
+<DIRECTIVE2>"]"            { BEGIN INITIAL; return ']'; }
+<DIRECTIVE>\n      { BEGIN INITIAL; return '\n'; }
+<DIRECTIVE2>\n     { BEGIN INITIAL; return '\n'; }
+<DIRECTIVE>{WS}+    ;
+<DIRECTIVE2>{WS}+   ;
+<DIRECTIVE>[a-z]+   {
+    BEGIN DIRECTIVE2;
+    yylval.str_val = strdup(yytext);
+    if(!yylval.str_val)
+       Fatal(FATAL_NOMEM);
+    return DIRECTIVE_NAME;
+}
+    /* everything printable except for ' ', '[' and ']'. */
+<DIRECTIVE2>[!-Z\^-~]+ {
+    yylval.str_val = strdup(yytext);
+    if(!yylval.str_val)
+       Fatal(FATAL_NOMEM);
+    return DIRECTIVE_VAL;
+}
+<DIRECTIVE>. {
+    Warning(WARN_UNREC_CHAR, (char *)NULL, conv_unprint(yytext[0]));
+}
+<DIRECTIVE2>. {
+    Warning(WARN_UNREC_CHAR, (char *)NULL, conv_unprint(yytext[0]));
+}
 
     /* size specifiers */
 byte   { yylval.int_val = 1; return BYTE; }
@@ -233,6 +257,8 @@ lsl { return INS_LSL; }
     if(locallabel_base)
        free(locallabel_base);
     locallabel_base = strdup(yytext);
+    if(!locallabel_base)
+       Fatal(FATAL_NOMEM);
 
     return s->type;
 }
@@ -241,5 +267,7 @@ lsl { return INS_LSL; }
 
 {WS}+  ;
 
-\n return '\n';
+\n     return '\n';
+
+.      { Warning(WARN_UNREC_CHAR, (char *)NULL, conv_unprint(yytext[0])); }
 
index 327c85dc61ab968da019e02e147abd0703bd3102..2c0ff312da3249eb2d5a7981ad84c0bd28411a99 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: token.l,v 1.1 2001/05/15 05:20:39 peter Exp $
+/* $Id: token.l,v 1.2 2001/05/20 08:35:18 peter Exp $
  * Main lexer
  *
  *  Copyright (C) 2001  Peter Johnson
 #include <string.h>
 #include "symrec.h"
 #include "bytecode.h"
+#include "errwarn.h"
 #include "bison.tab.h"
+
 %}
 %option noyywrap
 %option nounput
 %option case-insensitive
     static char *locallabel_base = (char *)NULL;
 
+%x DIRECTIVE DIRECTIVE2
+
 DIGIT    [0-9]
 BINDIGIT [01]
 OCTDIGIT [0-7]
@@ -74,14 +78,34 @@ WS       [ \t\r]
     yylval.double_val = strtod(yytext, (char **)NULL);
     return FLTNUM;
 }
-    /* directives */
-bits       { return BITS; }
-section            { return SECTION; }
-segment            { return SECTION; }
-absolute    { return ABSOLUTE; }
-extern     { return EXTERN; }
-global     { return GLOBAL; }
-common     { return COMMON; }
+    /* directive: [name value] */
+^"["   { BEGIN DIRECTIVE; return '['; }
+<DIRECTIVE>"]"     { BEGIN INITIAL; return ']'; }
+<DIRECTIVE2>"]"            { BEGIN INITIAL; return ']'; }
+<DIRECTIVE>\n      { BEGIN INITIAL; return '\n'; }
+<DIRECTIVE2>\n     { BEGIN INITIAL; return '\n'; }
+<DIRECTIVE>{WS}+    ;
+<DIRECTIVE2>{WS}+   ;
+<DIRECTIVE>[a-z]+   {
+    BEGIN DIRECTIVE2;
+    yylval.str_val = strdup(yytext);
+    if(!yylval.str_val)
+       Fatal(FATAL_NOMEM);
+    return DIRECTIVE_NAME;
+}
+    /* everything printable except for ' ', '[' and ']'. */
+<DIRECTIVE2>[!-Z\^-~]+ {
+    yylval.str_val = strdup(yytext);
+    if(!yylval.str_val)
+       Fatal(FATAL_NOMEM);
+    return DIRECTIVE_VAL;
+}
+<DIRECTIVE>. {
+    Warning(WARN_UNREC_CHAR, (char *)NULL, conv_unprint(yytext[0]));
+}
+<DIRECTIVE2>. {
+    Warning(WARN_UNREC_CHAR, (char *)NULL, conv_unprint(yytext[0]));
+}
 
     /* size specifiers */
 byte   { yylval.int_val = 1; return BYTE; }
@@ -233,6 +257,8 @@ lsl { return INS_LSL; }
     if(locallabel_base)
        free(locallabel_base);
     locallabel_base = strdup(yytext);
+    if(!locallabel_base)
+       Fatal(FATAL_NOMEM);
 
     return s->type;
 }
@@ -241,5 +267,7 @@ lsl { return INS_LSL; }
 
 {WS}+  ;
 
-\n return '\n';
+\n     return '\n';
+
+.      { Warning(WARN_UNREC_CHAR, (char *)NULL, conv_unprint(yytext[0])); }
 
index b108c50fa796ec6712d2b7bc1bf3b933ebab3885..cafa6ba94c7dec7c9317d95bc057f908864b7586 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: token.l.in,v 1.1 2001/05/15 05:20:39 peter Exp $
+/* $Id: token.l.in,v 1.2 2001/05/20 08:35:18 peter Exp $
  * Main lexer
  *
  *  Copyright (C) 2001  Peter Johnson
 #include <string.h>
 #include "symrec.h"
 #include "bytecode.h"
+#include "errwarn.h"
 #include "bison.tab.h"
+
 %}
 %option noyywrap
 %option nounput
 %option case-insensitive
     static char *locallabel_base = (char *)NULL;
 
+%x DIRECTIVE DIRECTIVE2
+
 DIGIT    [0-9]
 BINDIGIT [01]
 OCTDIGIT [0-7]
@@ -74,14 +78,34 @@ WS       [ \t\r]
     yylval.double_val = strtod(yytext, (char **)NULL);
     return FLTNUM;
 }
-    /* directives */
-bits       { return BITS; }
-section            { return SECTION; }
-segment            { return SECTION; }
-absolute    { return ABSOLUTE; }
-extern     { return EXTERN; }
-global     { return GLOBAL; }
-common     { return COMMON; }
+    /* directive: [name value] */
+^"["   { BEGIN DIRECTIVE; return '['; }
+<DIRECTIVE>"]"     { BEGIN INITIAL; return ']'; }
+<DIRECTIVE2>"]"            { BEGIN INITIAL; return ']'; }
+<DIRECTIVE>\n      { BEGIN INITIAL; return '\n'; }
+<DIRECTIVE2>\n     { BEGIN INITIAL; return '\n'; }
+<DIRECTIVE>{WS}+    ;
+<DIRECTIVE2>{WS}+   ;
+<DIRECTIVE>[a-z]+   {
+    BEGIN DIRECTIVE2;
+    yylval.str_val = strdup(yytext);
+    if(!yylval.str_val)
+       Fatal(FATAL_NOMEM);
+    return DIRECTIVE_NAME;
+}
+    /* everything printable except for ' ', '[' and ']'. */
+<DIRECTIVE2>[!-Z\^-~]+ {
+    yylval.str_val = strdup(yytext);
+    if(!yylval.str_val)
+       Fatal(FATAL_NOMEM);
+    return DIRECTIVE_VAL;
+}
+<DIRECTIVE>. {
+    Warning(WARN_UNREC_CHAR, (char *)NULL, conv_unprint(yytext[0]));
+}
+<DIRECTIVE2>. {
+    Warning(WARN_UNREC_CHAR, (char *)NULL, conv_unprint(yytext[0]));
+}
 
     /* size specifiers */
 byte   { yylval.int_val = 1; return BYTE; }
@@ -233,6 +257,8 @@ lsl { return INS_LSL; }
     if(locallabel_base)
        free(locallabel_base);
     locallabel_base = strdup(yytext);
+    if(!locallabel_base)
+       Fatal(FATAL_NOMEM);
 
     return s->type;
 }
@@ -241,5 +267,7 @@ lsl { return INS_LSL; }
 
 {WS}+  ;
 
-\n return '\n';
+\n     return '\n';
+
+.      { Warning(WARN_UNREC_CHAR, (char *)NULL, conv_unprint(yytext[0])); }