expr.atg

来自「自己写的关于编译原理的实验报告的源代码」· ATG 代码 · 共 68 行

ATG
68
字号
$C   /* Generate Main Module */
COMPILER Expr
/* This is a simple expression calculator */

/*----------------- Scanner Specifications ----------------------*/

CHARACTERS
    letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".
    digit  = "0123456789".
    tab    = CHR(9).
    eol    = CHR(10).

TOKENS
    ident   =  letter {letter|digit}.
    number  =  digit  { digit }.

IGNORE eol+tab

COMMENTS FROM "--" TO eol

/*--------------------Parser Specification -------------------*/

PRODUCTIONS
    Expr = StatSeq .

    StatSeq = SYNC { Stat ";" SYNC} .

    Stat =                          (. int value; .)
       Expression<&value>           (. printf("%d\n", value); .)
      .

    Expression<int *result> =       (. int result1, result2; .)
       Term<&result1>
       {   "+" Term<&result2>       (. result1 += result2; .)
	 | "-" Term<&result2>       (. result1 -= result2; .)
       }                            (. *result = result1; .)
       .

    Term<int *result> =             (. int result1, result2; .)
       Factor<&result1>
       {   '*' Factor<&result2>     (. result1 *= result2; .)
	 | '/' Factor<&result2>     (. result1 /= result2; .)
       }                            (. *result = result1; .)
       .

    Factor<int *result> =           (. int sign = 1; .)
      [ "-"                         (. sign =- 1; .)
      ]
      (   Number<result>
	| "(" Expression<result> ")"
      )                            (. *result *= sign; .)
      .

   Number<int *result>
	=                          (. char buff[20]; .)
	number                     (. S_GetString(S_Pos, S_Len, buff, sizeof(buff) - 1);
				      *result = atoi(buff); .)
	.

/*
   Ident<char *name>
	=
	ident                      (. S_GetString(S_Pos, S_Len, name, 20); .)
	.
*/

END Expr.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?