//converted from C++ to Java applet. DFW //Truth-table //enter proposition/compund statement/Boolean expression. //single letter variables only. //modified for boolean expressions DFW // & | ~ operators, variables, 0 1 //Stroustrup's real-number calculator. C++ Programming Language chapter 6. //Ex. to evaluate with p true and q false: // p=1; q=0; (p&(~(~p|q)))|(p&q) //or as: // 1&(~(~1|0))|(1&0) //as command line argument or interactively. //Interactively: either on one line, or each semicoloned statement on own line: //p=1 //q=0; //(p&(~(~p|q)))|(p&q) //semicolon is optional. //White space optional: (p & (~( ~p|q))) |(p & q) //Parens optional. & higher precedence than | //p&(~(~p|q))|p&q import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; public class TruthTable extends JApplet { public final char NAME='\000', NUMBER='\001', END='\002', OR='|', NEGATE='~', AND='&', PRINT=';', ASSIGN='=', LP='(', RP=')'; char curr_tok = PRINT; String input; int index; boolean bool_value; String string_value; int no_of_errors; Map table; JTextField inputField; JButton clearButton; JLabel errorLabel; JTextArea ttArea; public void init() { table = new HashMap(); Container container = getContentPane(); int panelRowsSize = 3; //container.setLayout( new GridLayout( panelRowsSize, 1 ) ); container.setLayout( new FlowLayout( ) ); JPanel [] panelRows = new JPanel[panelRowsSize]; for (int i=0; i>var_num_shift) & 1) == 0 ) b = Boolean.valueOf( false ); else b = Boolean.valueOf( true ); table.put( (String)iter.next(), b ); ttArea.append(" " + ((row>>var_num_shift)&1)); var_num_shift--; } ttArea.append( " " ); index = 0; while ( index < input.length() ) { get_token(); if (curr_tok == END) break; if (curr_tok == PRINT) continue; ttArea.append( expr( false ) + "\n" ); } } } } ); ttArea = new JTextArea( 10, 20 ); JScrollPane ttScroll = new JScrollPane( ttArea ); panelRows[1].add( ttScroll ); clearButton = new JButton( "Clear" ); panelRows[2].add( clearButton ); clearButton.addActionListener( new ActionListener () { public void actionPerformed( ActionEvent event ) { inputField.setText( "" ); errorLabel.setText( "" ); ttArea.setText( "" ); inputField.requestFocusInWindow(); } } ); errorLabel = new JLabel( "" ); panelRows[2].add( errorLabel ); } public void start() { inputField.requestFocusInWindow(); } boolean expr (boolean get) { boolean left=term(get); for (;;) switch(curr_tok) { case OR: left |= term(true); break; default: return left; } } boolean term (boolean get) { boolean left=prim(get); for (;;) switch (curr_tok) { case AND: left &= prim(true); break; default: return left; } } boolean prim (boolean get) { if (get) get_token(); switch (curr_tok) { case NUMBER: {boolean v = bool_value; get_token(); return v; } case NAME: {if (get_token() == ASSIGN) { boolean v = expr(true); table.put( string_value, new Boolean( v ) ); return v; } else if ( table.containsKey( string_value ) ) return ((Boolean)table.get(string_value)).booleanValue(); else return error( "undefined variable" ); } case NEGATE: return !prim(true); case LP: {boolean e = expr(true); if (curr_tok != RP) return error("')' expected"); get_token(); return e; } default: return error("primary expected"); } } //Token_value get_token() { char get_token() { char ch; do { if ( index == input.length() ) return curr_tok=END; else ch = input.charAt( index++ ); } while (ch!='\n' && ch==' '); switch (ch) { case ';': case '\n': return curr_tok=PRINT; case '&': case '|': case '~': case '(': case ')': case '=': return curr_tok = ch; case '0': //case 'f': //basically, so t can be a variable... //case 'F': bool_value = false; return curr_tok=NUMBER; case '1': //case 't': //case 'T': bool_value = true; return curr_tok=NUMBER; default: if ( Character.isLetter( ch ) ) { string_value = ""+ch; //will stick with one-letter variables... so this won't be used while (index