演算子順位法

op_index()

int op_index(elem* p) {
 switch (p->token) {
  case BGN : return 0 ;
case '+' : return 1 ;
case '*' : return 2 ;
case '(' : return 3 ;
case ')' : return 4 ;
case NUM : return 5 ;
case END : return 6 ;
  default: printf("op_index: 不正な構文要素 (");
     debug_token(p->token, p->val);
     printf(")。\n");
     exit(1);
     return 0;
 }
}

prec_table[ ][ ]

char prec_table[6][6] = {
{ LT LT LT ERR LT EQ },
{ GT LT LT GT LT GT },
{ GT GT LT GT LT GT },
{ LT LT LT EQ LT ERR },
{ GT GT ERR GT ERR GT },
{ GT GT ERR GT ERR GT },
}

binary_op()

YYSTYPE binary_op(YYSTYPE left, int op, YYSTYPE right) {
 printf(" 還元: Expr -> Expr "); debug_token(op, 0); printf(" Expr\n");
 switch (op) {
   case '+': return left + right;
   case '*': return left * right;
  default:
   printf("処理できない二項演算子: "); debug_token(op, 0); printf("\n");
   exit(7);
   return 0;
 }
}

追加した演算子を用いて計算することができます. 数式を入力し、送信すると計算が実行されます. 構文木内のボタンを押すことで計算過程を確認することができます.


本来の計算ルール

入力

$

ユーザの計算ルール

入力

$

スタック

トークン $
属性値 $

スタック

トークン $
属性値 $

構文木

構文木

演算子順位行列

演算子順位行列