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 + -
显示快捷键?