Annotation of Examples/AppKit/Graph/token.lm, revision 1.1.1.1

1.1       root        1: 
                      2: %{
                      3: /*
                      4:     token.lm
                      5: 
                      6:     This file defines the tokens that the Expression grammar is built on.  To
                      7:     fully understand this file, you will need to understand lex.  The basic
                      8:     idea is that lex scans a text stream and breaks that stream up into tokens
                      9:     which are then fed to the grammar (defined in yacc).  Whitespace is ignored
                     10:     so the grammar is just fed a steady stream of significant tokens.
                     11: */
                     12: 
                     13: /*
                     14:  * These are the routines lex calls to get another character as it parses.
                     15:  * By default they are macros which read from stdin. We toss the default
                     16:  * macro definitions and supply our own versions of these, which will feed
                     17:  * lex characters from the expression string we are parsing.
                     18:  */
                     19: #undef input
                     20: #undef unput
                     21: #undef output
                     22: static int input();
                     23: static void unput(char c);
                     24: static void output(char c);
                     25: 
                     26: #import <stdlib.h>
                     27: #import <string.h>
                     28: #import <math.h>
                     29: #import "exprDefs.h"
                     30: #import "y.tab.h"
                     31: 
                     32: /* global which holds the string we are parsing */
                     33: static const char *CurrText;
                     34: 
                     35: /* glue to get rid of compiler warnings */
                     36: extern yylook(), yyback();
                     37: static int yywrap();
                     38: %}
                     39: 
                     40: DIGIT    ([0-9])
                     41: EXP      ([Ee][+-]?[0-9]+)
                     42: 
                     43: %%
                     44: 
                     45: 
                     46: [ \t\n]+ {             /* whitespace - we ignore it */
                     47:        ;
                     48: }
                     49: 
                     50: {DIGIT}+ {             /* an integer */
                     51:        yylval.integer = atoi(yytext);
                     52:        return INTEGER;
                     53: }
                     54: 
                     55: (({DIGIT}+"."{DIGIT}*{EXP}?)|([+-]?{DIGIT}*"."{DIGIT}+{EXP}?)|({DIGIT}+{EXP})) {                   /* a float */
                     56:        yylval.real = atof(yytext);
                     57:        return NUMBER;
                     58: }
                     59: 
                     60: {DIGIT}+"#"[a-zA-Z0-9]+ {      /* a radix number */
                     61:        int radix;
                     62:        register int mult = 1;
                     63:        register char *c, *stop;
                     64:        register unsigned int accum = 0;
                     65:        register int charVal;
                     66: 
                     67:        sscanf( yytext, "%d#", &radix );
                     68:        for( stop = yytext; *stop++ != '#'; ); /* skip the pound sign */
                     69:        for( c = yytext+yyleng-1; c >= stop; c--, mult *= radix ) {
                     70:            if( *c >= '0' && *c <= '9' )
                     71:                charVal = *c - '0';
                     72:            else if( *c >= 'A' && *c <= 'Z' )
                     73:                charVal = *c - 'A' + 10;
                     74:            else
                     75:                charVal = *c - 'a' + 10;
                     76:            accum += mult * charVal;
                     77:        }
                     78:        yylval.real = accum;
                     79:        return NUMBER;
                     80: }
                     81: 
                     82: pi {                   /* the constant pi */
                     83:        yylval.real = M_PI;
                     84:        return NUMBER;
                     85: }
                     86: 
                     87: e {                    /* the constant e */
                     88:        yylval.real = M_E;
                     89:        return NUMBER;
                     90: }
                     91: 
                     92: [-+*/%^(),]  {                 /* a single char that must be recognized */
                     93:        return yytext[0];
                     94: }
                     95: 
                     96: [A-Za-z_][A-Za-z_0-9]* {       /* an identifier */
                     97:        yylval.string = NXZoneMalloc(NXDefaultMallocZone(), yyleng+1); 
                     98:        bcopy(yytext, yylval.string, yyleng);
                     99:        yylval.string[yyleng] = '\0';
                    100:        return IDENTIFIER;
                    101: }
                    102: 
                    103: . {            /* other garbage chars (last rule is the default) */
                    104:        yylval.character = yytext[0];
                    105:        return BADCHAR;
                    106: }
                    107: 
                    108: 
                    109: %%
                    110: 
                    111: /* inits the global string to the one we will parse */
                    112: void _EXPPrepareToScan(const char *text) {
                    113:     CurrText = text;
                    114: }
                    115: 
                    116: /* tells lex there's really no more input when we're done */
                    117: static int yywrap() {
                    118:     return 1;
                    119: }
                    120: 
                    121: /* returns the next char of the string we're parsing */
                    122: static int input() {
                    123:     return *CurrText++;
                    124: }
                    125: 
                    126: /* lets lex back up one char in the string we're parsing */
                    127: static void unput(char c) {
                    128:     --CurrText;
                    129: }
                    130: 
                    131: /* called by lex when it wants to output a char.  This should never happen. */
                    132: static void output(char c) {
                    133:     fprintf(stderr, "lex output function called with char '%c'\n", c);
                    134: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.