From: Peter Johnson Date: Sun, 20 May 2001 08:35:18 +0000 (-0000) Subject: Changed implementation of directives. Added some rudimentary error checking. X-Git-Tag: v0.1.0~495 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bc2b7f3194642918c6ba0fa4a9bfd5228f66a385;p=yasm Changed implementation of directives. Added some rudimentary error checking. svn path=/trunk/yasm/; revision=16 --- diff --git a/modules/parsers/nasm/bison.y.in b/modules/parsers/nasm/bison.y.in index edeb7b12..f1c045be 100644 --- a/modules/parsers/nasm/bison.y.in +++ b/modules/parsers/nasm/bison.y.in @@ -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 INTNUM %token FLTNUM -%token BITS SECTION ABSOLUTE EXTERN GLOBAL COMMON +%token DIRECTIVE_NAME DIRECTIVE_VAL %token BYTE WORD DWORD QWORD TWORD DQWORD %token DECLARE_DATA %token RESERVE_SPACE @@ -68,6 +70,7 @@ extern void yyerror(char *); %type aaa aad idiv imul in loopz lsl %type line exp instr instrbase + %type fpureg reg32 reg16 reg8 reg_dess reg_fsgs reg_notcs %type mem memaddr memexp %type 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 */ diff --git a/modules/parsers/nasm/nasm-bison.y b/modules/parsers/nasm/nasm-bison.y index 3416da0a..8a983ddb 100644 --- a/modules/parsers/nasm/nasm-bison.y +++ b/modules/parsers/nasm/nasm-bison.y @@ -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 INTNUM %token FLTNUM -%token BITS SECTION ABSOLUTE EXTERN GLOBAL COMMON +%token DIRECTIVE_NAME DIRECTIVE_VAL %token BYTE WORD DWORD QWORD TWORD DQWORD %token DECLARE_DATA %token RESERVE_SPACE @@ -68,6 +70,7 @@ extern void yyerror(char *); %type aaa aad idiv imul in loopz lsl %type line exp instr instrbase + %type fpureg reg32 reg16 reg8 reg_dess reg_fsgs reg_notcs %type mem memaddr memexp %type 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 */ diff --git a/modules/parsers/nasm/token.l.in b/modules/parsers/nasm/token.l.in index b108c50f..cafa6ba9 100644 --- a/modules/parsers/nasm/token.l.in +++ b/modules/parsers/nasm/token.l.in @@ -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 @@ -24,13 +24,17 @@ #include #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 '['; } +"]" { BEGIN INITIAL; return ']'; } +"]" { BEGIN INITIAL; return ']'; } +\n { BEGIN INITIAL; return '\n'; } +\n { BEGIN INITIAL; return '\n'; } +{WS}+ ; +{WS}+ ; +[a-z]+ { + BEGIN DIRECTIVE2; + yylval.str_val = strdup(yytext); + if(!yylval.str_val) + Fatal(FATAL_NOMEM); + return DIRECTIVE_NAME; +} + /* everything printable except for ' ', '[' and ']'. */ +[!-Z\^-~]+ { + yylval.str_val = strdup(yytext); + if(!yylval.str_val) + Fatal(FATAL_NOMEM); + return DIRECTIVE_VAL; +} +. { + Warning(WARN_UNREC_CHAR, (char *)NULL, conv_unprint(yytext[0])); +} +. { + 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])); } diff --git a/src/bison.y b/src/bison.y index 16b7157c..84de4e8d 100644 --- a/src/bison.y +++ b/src/bison.y @@ -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 INTNUM %token FLTNUM -%token BITS SECTION ABSOLUTE EXTERN GLOBAL COMMON +%token DIRECTIVE_NAME DIRECTIVE_VAL %token BYTE WORD DWORD QWORD TWORD DQWORD %token DECLARE_DATA %token RESERVE_SPACE @@ -68,6 +70,7 @@ extern void yyerror(char *); %type aaa aad idiv imul in loopz lsl %type line exp instr instrbase + %type fpureg reg32 reg16 reg8 reg_dess reg_fsgs reg_notcs %type mem memaddr memexp %type 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 */ diff --git a/src/bison.y.in b/src/bison.y.in index edeb7b12..f1c045be 100644 --- a/src/bison.y.in +++ b/src/bison.y.in @@ -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 INTNUM %token FLTNUM -%token BITS SECTION ABSOLUTE EXTERN GLOBAL COMMON +%token DIRECTIVE_NAME DIRECTIVE_VAL %token BYTE WORD DWORD QWORD TWORD DQWORD %token DECLARE_DATA %token RESERVE_SPACE @@ -68,6 +70,7 @@ extern void yyerror(char *); %type aaa aad idiv imul in loopz lsl %type line exp instr instrbase + %type fpureg reg32 reg16 reg8 reg_dess reg_fsgs reg_notcs %type mem memaddr memexp %type 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 */ diff --git a/src/parsers/nasm/bison.y.in b/src/parsers/nasm/bison.y.in index edeb7b12..f1c045be 100644 --- a/src/parsers/nasm/bison.y.in +++ b/src/parsers/nasm/bison.y.in @@ -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 INTNUM %token FLTNUM -%token BITS SECTION ABSOLUTE EXTERN GLOBAL COMMON +%token DIRECTIVE_NAME DIRECTIVE_VAL %token BYTE WORD DWORD QWORD TWORD DQWORD %token DECLARE_DATA %token RESERVE_SPACE @@ -68,6 +70,7 @@ extern void yyerror(char *); %type aaa aad idiv imul in loopz lsl %type line exp instr instrbase + %type fpureg reg32 reg16 reg8 reg_dess reg_fsgs reg_notcs %type mem memaddr memexp %type 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 */ diff --git a/src/parsers/nasm/nasm-bison.y b/src/parsers/nasm/nasm-bison.y index 3416da0a..8a983ddb 100644 --- a/src/parsers/nasm/nasm-bison.y +++ b/src/parsers/nasm/nasm-bison.y @@ -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 INTNUM %token FLTNUM -%token BITS SECTION ABSOLUTE EXTERN GLOBAL COMMON +%token DIRECTIVE_NAME DIRECTIVE_VAL %token BYTE WORD DWORD QWORD TWORD DQWORD %token DECLARE_DATA %token RESERVE_SPACE @@ -68,6 +70,7 @@ extern void yyerror(char *); %type aaa aad idiv imul in loopz lsl %type line exp instr instrbase + %type fpureg reg32 reg16 reg8 reg_dess reg_fsgs reg_notcs %type mem memaddr memexp %type 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 */ diff --git a/src/parsers/nasm/token.l.in b/src/parsers/nasm/token.l.in index b108c50f..cafa6ba9 100644 --- a/src/parsers/nasm/token.l.in +++ b/src/parsers/nasm/token.l.in @@ -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 @@ -24,13 +24,17 @@ #include #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 '['; } +"]" { BEGIN INITIAL; return ']'; } +"]" { BEGIN INITIAL; return ']'; } +\n { BEGIN INITIAL; return '\n'; } +\n { BEGIN INITIAL; return '\n'; } +{WS}+ ; +{WS}+ ; +[a-z]+ { + BEGIN DIRECTIVE2; + yylval.str_val = strdup(yytext); + if(!yylval.str_val) + Fatal(FATAL_NOMEM); + return DIRECTIVE_NAME; +} + /* everything printable except for ' ', '[' and ']'. */ +[!-Z\^-~]+ { + yylval.str_val = strdup(yytext); + if(!yylval.str_val) + Fatal(FATAL_NOMEM); + return DIRECTIVE_VAL; +} +. { + Warning(WARN_UNREC_CHAR, (char *)NULL, conv_unprint(yytext[0])); +} +. { + 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])); } diff --git a/src/token.l b/src/token.l index 327c85dc..2c0ff312 100644 --- a/src/token.l +++ b/src/token.l @@ -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 @@ -24,13 +24,17 @@ #include #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 '['; } +"]" { BEGIN INITIAL; return ']'; } +"]" { BEGIN INITIAL; return ']'; } +\n { BEGIN INITIAL; return '\n'; } +\n { BEGIN INITIAL; return '\n'; } +{WS}+ ; +{WS}+ ; +[a-z]+ { + BEGIN DIRECTIVE2; + yylval.str_val = strdup(yytext); + if(!yylval.str_val) + Fatal(FATAL_NOMEM); + return DIRECTIVE_NAME; +} + /* everything printable except for ' ', '[' and ']'. */ +[!-Z\^-~]+ { + yylval.str_val = strdup(yytext); + if(!yylval.str_val) + Fatal(FATAL_NOMEM); + return DIRECTIVE_VAL; +} +. { + Warning(WARN_UNREC_CHAR, (char *)NULL, conv_unprint(yytext[0])); +} +. { + 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])); } diff --git a/src/token.l.in b/src/token.l.in index b108c50f..cafa6ba9 100644 --- a/src/token.l.in +++ b/src/token.l.in @@ -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 @@ -24,13 +24,17 @@ #include #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 '['; } +"]" { BEGIN INITIAL; return ']'; } +"]" { BEGIN INITIAL; return ']'; } +\n { BEGIN INITIAL; return '\n'; } +\n { BEGIN INITIAL; return '\n'; } +{WS}+ ; +{WS}+ ; +[a-z]+ { + BEGIN DIRECTIVE2; + yylval.str_val = strdup(yytext); + if(!yylval.str_val) + Fatal(FATAL_NOMEM); + return DIRECTIVE_NAME; +} + /* everything printable except for ' ', '[' and ']'. */ +[!-Z\^-~]+ { + yylval.str_val = strdup(yytext); + if(!yylval.str_val) + Fatal(FATAL_NOMEM); + return DIRECTIVE_VAL; +} +. { + Warning(WARN_UNREC_CHAR, (char *)NULL, conv_unprint(yytext[0])); +} +. { + 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])); }