main.c
来自「简单的编译词法分析 in c」· C语言 代码 · 共 111 行
C
111 行
/* re.c*/#include <stdio.h>#include "machop.h"/* A ::= [:alnum:] E ::= A E ::= EE E ::= E'|'E E ::= '('E')' E ::= E'*' E ::= A|EE|E'|'E|'('E')'|E'*' E ::= (A|'('E')'){E|'|'E|'*'} */char sym;#define NEXTSYM \{ \ sym = getchar(); \ if (sym != '|' && sym != '*' \ && sym != '(' && sym != ')' \ && !isalnum(sym) \ && sym != '\n') \ SYNERR_I; \} #define SYNERR(err) \{ \ fputs("syntax error: " err "\n", stderr); \ exit(1); \}#define SYNERR_P SYNERR("parenthese not match")//括号不匹配#define SYNERR_I SYNERR("invalid character!")//问题字符#include "proc.h"void parseE() { switch (sym) { case '(': procsym(); NEXTSYM; parseE(); if (sym != ')') SYNERR_P; procsym(); NEXTSYM; break; case ')': SYNERR_P; break; case '\n': return; break; default: if (!isalnum(sym)) SYNERR_I; procsym(); NEXTSYM; break; } while (sym != '\n') { char ch; switch (sym) { case '|': procsym(); NEXTSYM; parseE(); break; case '*': procsym(); NEXTSYM; break; case '(': mkdot(); parseE(); break; case ')': return; default: mkdot(); parseE(); } }}void dump_expr() { expr[elen] = '\n'; expr[elen] = '\0'; puts("\nLevel2:\n\t"); puts(expr);}int main(int argc, char *argv[]){ NEXTSYM; parseE(); eflush(); if (sym != '\n') SYNERR_P; puts("\nLevel1:\n\tSytanx correct!\n"); dump_expr(); genm(); runm(); return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?