mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
1.8 KiB
131 lines
1.8 KiB
|
|
|
|
#include <stdio.h>
|
|
|
|
char *PgmName=0; int ShowLit=0;
|
|
int ShowProd=1; int ShowBNF=0;
|
|
int ProdNbr=0; int FirstProd=0;
|
|
int ErrorCnt=0;
|
|
|
|
char pc='x';
|
|
char cc;
|
|
int lp=0;
|
|
|
|
void
|
|
main(argc, argv)
|
|
int argc;
|
|
char **argv;
|
|
{
|
|
PgmName = *argv;
|
|
--argc, ++argv;
|
|
while (argc && ((**argv == '-') || (**argv == '+'))) {
|
|
char *cp=&argv[0][1];
|
|
|
|
while (*cp) {
|
|
switch (*cp) {
|
|
default:
|
|
exit(-1);
|
|
}
|
|
++cp;
|
|
}
|
|
--argc, ++argv;
|
|
}
|
|
if (argc && (freopen(*argv, "r", stdin) == NULL)) {
|
|
perror(PgmName);
|
|
exit(-1);
|
|
}
|
|
yylex();
|
|
exit(ErrorCnt);
|
|
}
|
|
|
|
%%
|
|
[a-z][a-z0-9A-Z_]* NonTerminal(yytext);
|
|
"KW_"[A-Z][A-Z0-9_]* Keyword(yytext);
|
|
[A-Z][A-Z0-9_]* Terminal(yytext);
|
|
":"$ printf(" ::= ");
|
|
"'"."'" printf("\"%c\"", yytext[1]);
|
|
|
|
.|"\n" ECHO;
|
|
%%
|
|
|
|
int
|
|
NonTerminal(char* text)
|
|
{
|
|
printf("<%s>", text);
|
|
}
|
|
|
|
int
|
|
Terminal(char* text)
|
|
{
|
|
char *my_text, *malloc();
|
|
char c;
|
|
int i;
|
|
|
|
my_text = malloc(strlen(text)+1);
|
|
my_text[0] = text[0];
|
|
|
|
// ASCII conversion to lower case
|
|
for (i=1; (c = text[i]) != '\0'; i++) {
|
|
if ( 'A' <= c && c <= 'Z' ) {
|
|
my_text[i] = 'a' + c - 'A'; }
|
|
else {
|
|
my_text[i] = c;
|
|
}
|
|
}
|
|
my_text[i] = c;
|
|
|
|
printf("<%s>", my_text);
|
|
free(my_text);
|
|
}
|
|
|
|
int
|
|
Keyword(char* text)
|
|
{
|
|
char *my_text, *malloc();
|
|
char c;
|
|
int i;
|
|
my_text = malloc(strlen(text)+1);
|
|
|
|
// ASCII conversion to lower case
|
|
for (i=0; (c = text[i+3]) != '\0'; i++) {
|
|
if ( 'A' <= c && c <= 'Z' ) {
|
|
my_text[i] = 'a' + c - 'A'; }
|
|
else {
|
|
my_text[i] = c;
|
|
}
|
|
}
|
|
my_text[i] = c;
|
|
|
|
printf("\"%s\"", my_text);
|
|
free(my_text);
|
|
}
|
|
|
|
|
|
int
|
|
check(char cc)
|
|
{
|
|
if( pc!='\'' )
|
|
{
|
|
switch(cc) {
|
|
case '{':
|
|
lp++;
|
|
break;
|
|
|
|
case '}':
|
|
lp--;
|
|
break;
|
|
|
|
default:
|
|
if (lp==0) ECHO;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{ if (lp==0) ECHO;
|
|
};
|
|
|
|
pc = cc;
|
|
}
|
|
|
|
|
|
|