つづき(式の評価 eval)
!論理式の計算 FUNCTION propositional_expression(s$) !命題 LET v1=boolean_expression(s$) LET t$=token$(s$) DO WHILE t$="⇒" OR t$="⇔" !包含、同値 LET p=p+1 !eat it CALL push(stack_Eval,sp_Eval, v1) IF t$="⇒" THEN !計算する ※term$()でt$が破壊されるため LET v2=boolean_expression(s$) CALL pop(stack_Eval,sp_Eval, v1) LET v1=BitOR(BitNOT(v1),v2) !A⇒B=¬A∪B=A'+B ELSE LET v2=boolean_expression(s$) CALL pop(stack_Eval,sp_Eval, v1) LET vv1=BitAND(BitNOT(v1),BitNOT(v2)) !v1=!(v1 xor v2) LET vv2=BitAND(v1,v2) LET v1=BitOR(vv1,vv2) END IF LET t$=token$(s$) !次へ LOOP LET propositional_expression=v1 END FUNCTION
FUNCTION boolean_expression(s$) !式 LET v1=term(s$) LET t$=token$(s$) DO WHILE t$="+" OR t$="∪" OR t$="∨" OR t$="-" OR t$="|" !和、差なら LET p=p+1 !eat it CALL push(stack_Eval,sp_Eval, v1) IF t$="-" THEN !計算する ※term$()でt$が破壊されるため LET v2=term(s$) CALL pop(stack_Eval,sp_Eval, v1) LET v2=BitNOT(v2) !A-B=A∩¬B=A*B' LET v1=BitAND(v1,v2) ELSE LET v2=term(s$) CALL pop(stack_Eval,sp_Eval, v1) LET v1=BitOR(v1,v2) !v1=v1|v2 END IF LET t$=token$(s$) !次へ LOOP LET boolean_expression=v1 END FUNCTION
FUNCTION term(s$) !項 LET v1=factor(s$) LET t$=token$(s$) DO WHILE t$="*" OR t$="・" OR t$="・" OR t$="∩" OR t$="∧" OR t$="&" !積なら LET p=p+1 !eat it CALL push(stack_Eval,sp_Eval, v1) LET v2=factor(s$) CALL pop(stack_Eval,sp_Eval, v1) LET v1=BitAND(v1,v2) !v1=v1&v2 LET t$=token$(s$) !次へ LOOP LET term=v1 END FUNCTION
|