POJ-2106: Boolean Expressions
問題概要
論理式を構文解析した結果を出力する問題。
解法
やるだけ。BNFは、
expr := term ( '|' term )^*
term := fact ( '&' fact )^*
fact := 'V' | 'F' | '(' expr ')' | '!' fact
#include <cstdio> using namespace std; char buf[1009]; char input[1009]; int p; bool expr(); bool term(); bool fact(); bool expr(){ bool ret = term(); while(input[p] == '|'){ p++; ret |= term(); } return ret; } bool term(){ bool ret = fact(); while(input[p] == '&'){ p++; ret &= fact(); } return ret; } bool fact(){ if(input[p] == '('){ p++; bool ret = expr(); p++; return ret; } else if(input[p] == 'V'){ p++; return true; } else if(input[p] == 'F'){ p++; return false; } else if(input[p] == '!'){ p++; return !fact(); } } bool solve(){ p = 0; for(int i=0; buf[i]; i++){ if(buf[i]!=' ') input[p++] = buf[i]; } input[p] = '\0'; p = 0; return expr(); } int main(){ int cnt = 1; while(gets(buf)){ printf("Expression %d: %c\n", cnt++, solve()?'V':'F'); } return 0; }