/* PrioExprApplet.java Author: atze Description: JPC Demo */ package nl.uu.cs.jpc; import nl.uu.cs.laf.* ; import java.awt.*; import java.awt.event.*; import java.applet.*; public class PrioExprApplet extends Applet { private Eval pPrios ; private Eval pExpr ; private Eval pPrios_res ; private Eval pExpr_res ; private long timingStart ; private long timingEnd ; private void setPriosRes( String s ) { pPrios_res = UUParsing.parse.apply3( pPrios, StdFuncs.isEmpty, Str.valueOf( s ) ) ; } private void setExprRes( String s ) { pExpr_res = UUParsing.parse.apply3 ( pExpr.apply1( StdFuncs.tupFirst.apply1( pPrios_res ) ) , StdFuncs.isEmpty , Str.valueOf( s ) ) ; } private void resetTiming() { Eval.resetNrEvaluations() ; timingStart = System.currentTimeMillis() ; } private void setTiming() { timingEnd = System.currentTimeMillis() ; textFieldTiming.setText( "" + (timingEnd - timingStart) + " ms., " + Eval.getNrEvaluations() + " evals, " + ((float)(timingEnd-timingStart))/Eval.getNrEvaluations() + " ms. per eval" ) ; } private void reEvalPrios() { setPriosRes( textAreaPriorities.getText() ) ; textAreaPrioErrors.setText( Eval.toString( StdFuncs.tupThird.apply1( pPrios_res ) ) ) ; reEvalExpr() ; } private void reEvalExpr() { setExprRes( textAreaExpression.getText() ) ; textAreaExprErrors.setText( Eval.toString( StdFuncs.tupThird.apply1( pExpr_res ) ) ) ; textFieldExprResult.setText( Eval.toString( StdFuncs.tupFirst.apply1( pExpr_res ) ) ) ; } // IMPORTANT: Source code between BEGIN/END comment pair will be regenerated // every time the form is saved. All manual changes will be overwritten. // BEGIN GENERATED CODE // member declarations java.awt.Label labelPriorities = new java.awt.Label(); java.awt.TextArea textAreaPriorities = new java.awt.TextArea(); java.awt.TextArea textAreaPrioErrors = new java.awt.TextArea(); java.awt.Label labelErrors = new java.awt.Label(); java.awt.Label labelExpression = new java.awt.Label(); java.awt.TextArea textAreaExpression = new java.awt.TextArea(); java.awt.TextArea textAreaExprErrors = new java.awt.TextArea(); java.awt.Label labelTiming = new java.awt.Label(); java.awt.TextField textFieldTiming = new java.awt.TextField(); java.awt.Label labelExprResult = new java.awt.Label(); java.awt.TextField textFieldExprResult = new java.awt.TextField(); // END GENERATED CODE boolean isStandalone = false; /**
module Expr where
import UU_Parsing
instance Symbol Char
pDigit = (\d -> ord d - ord '0') <$> pAnyOf ['0'..'9']
pNat = foldl (\a b -> a*10 + b) 0 <$> pSome pDigit
f_of_op :: Char -> Int -> Int -> Int
f_of_op op = case op
of '+' -> (\a b -> a+b)
'*' -> (\a b -> a*b)
'/' -> (\a b -> a `div` b)
'-' -> (\a b -> a-b)
pOp name = f_of_op name <$ pSym name
pOps names = foldr (<|>) pFail (map pOp names)
pParens = pPacked (pSym '(') (pSym ')')
pRoot prios = let pExpr = prios (pNat <|> pParens pExpr) in pExpr
pAnyOps = pOps <$> pSome (pAnyOf "*+/-^")
pPrios = pParens $
pFoldr ((.), id) ( ( pChainl <$ pSym 'L'
<|> pChainr <$ pSym 'R'
)
<*> pAnyOps
)
tt p1 p2 inp =
do let (res1, restinp, errors1) = parse p1 (const True) inp
putStr (show errors1)
let (res2 , _ , errors2) = parse (p2 res1) null restinp
putStr (show errors2)
putStr (show res2)
*/
public PrioExprApplet()
{
// pDigit = (\d -> ord d - ord '0') <$> pAnyOf ['0'..'9']
final Eval pDigit =
UUParsing.pApp.apply2
( StdFuncs.charToDigit
, UUParsing.pAnyOf.apply1( Str.valueOf( "0123456789" ) )
) ;
// pVar = (\c -> [c]) <$> pAnyOf ['a'..'z']
/*
final Eval pVar =
UUParsing.pApp.apply2
( StdFuncs.listOne
, UUParsing.pAnyOf.apply1( Str.valueOf( "abcdefghijklmnopqrstuvwxyz" ) )
) ;
*/
// pNat = foldl (\a b -> a*10 + b) 0 <$> pSome pDigit
final Eval pNat =
UUParsing.pApp.apply2
( StdFuncs.foldl.apply2
( new Function2()
{
public Object eval2( Object a, Object b )
{
return Int.valueOf( evalToI(a) * 10 + evalToI(b) ) ;
}
}
, StdVals.zero
)
, UUParsing.pSome.apply1( pDigit )
) ;
// f_of_op :: Char -> Int -> Int -> Int
// f_of_op op = case op
// of '+' -> (\a b -> a+b)
// '*' -> (\a b -> a*b)
// '/' -> (\a b -> a `div` b)
// '-' -> (\a b -> a-b)
final Eval f_of_op =
new Function1()
{
public Object eval1( Object op )
{
switch ( evalToC(op) )
{
case '+' : return StdFuncs.intAdd ;
case '*' : return StdFuncs.intMul ;
case '/' : return StdFuncs.intDiv ;
case '-' : return StdFuncs.intSub ;
}
return StdFuncs.error("missing case") ;
}
} ;
// pOp name = (\ left right -> left++right++[name]) <$ pSym name
/*
Eval pOp =
new Function1()
{
public Object eval1( final Object name )
{
return
UUParsing.pAppL.apply2
( new Function2()
{
public Object eval2( Object left, Object right )
{
return
StdFuncs.concat2.apply2
( StdFuncs.concat2.apply2
( left
, right
)
, StdFuncs.listOne.apply1( name )
) ;
}
}
, UUParsing.pSym.apply1( name )
) ;
}
} ;
*/
// pOp name = f_of_op name <$ pSym name
final Eval pOp =
new Function1()
{
public Object eval1( final Object name )
{
return
UUParsing.pAppL.apply2
( f_of_op.apply1( name )
, UUParsing.pSym.apply1( name )
) ;
}
} ;
// pOps names = foldr (<|>) pFail (map pOp names)
Eval pOps =
new Function1()
{
public Object eval1( Object names )
{
return
StdFuncs.foldr.apply3
( UUParsing.pChoice
, UUParsing.pFail
, StdFuncs.map.apply2
( pOp
, names
)
) ;
}
} ;
// pParens = pPacked (pSym '(') (pSym ')')
final Eval pParens =
UUParsing.pPacked.apply2
( UUParsing.pSym.apply1( new Character( '(' ) )
, UUParsing.pSym.apply1( new Character( ')' ) )
) ;
// pRoot prios = let pExpr = prios (pNat <|> pParens pExpr) in pExpr
pExpr =
new Function1()
{
public Object eval1( Object prios )
{
Indirection ind_pExpr = new Indirection() ;
Eval pExpr =
((Eval)prios).apply1
( UUParsing.pChoice.apply2
( pNat
, pParens.apply1( ind_pExpr )
)
) ;
ind_pExpr.set( pExpr ) ;
return pExpr ;
}
} ;
// pAnyOp = pOp <$> pAnyOf "*+/-^"
/*
Eval pAnyOp =
UUParsing.pApp.apply2
( pOp
, UUParsing.pAnyOf.apply1( Str.valueOf( "*+/-^" ) )
) ;
*/
// pAnyOps = pOps <$> pSome (pAnyOf "*+/-^")
Eval pAnyOps =
UUParsing.pApp.apply2
( pOps
, UUParsing.pSome.apply1
( UUParsing.pAnyOf.apply1( Str.valueOf( "*+/-^" ) )
)
) ;
// pPrios = pParens $
// pFoldr ((.), id) (( pChainl <$ pSym 'L'
// <|> pChainr <$ pSym 'R') <*> pAnyOp)
/*
Eval pPrios =
StdFuncs.apply.apply2
( pParens
, UUParsing.pFoldr.apply2
( new Tuple( StdFuncs.compose, StdFuncs.id )
, UUParsing.pSeq.apply2
( UUParsing.pChoice.apply2
( UUParsing.pAppL.apply2
( UUParsing.pChainl
, UUParsing.pSym.apply1( new Character( 'L' ) )
)
, UUParsing.pAppL.apply2
( UUParsing.pChainr
, UUParsing.pSym.apply1( new Character( 'R' ) )
)
)
, pAnyOp
)
)
) ;
*/
// pPrios = pParens $
// pFoldr ((.), id) ( ( pChainl <$ pSym 'L'
// <|> pChainr <$ pSym 'R'
// )
// <*> pAnyOps
// )
pPrios =
StdFuncs.apply.apply2
( pParens
, UUParsing.pFoldr.apply2
( new Tuple( StdFuncs.compose, StdFuncs.id )
, UUParsing.pSeq.apply2
( UUParsing.pChoice.apply2
( UUParsing.pAppL.apply2
( UUParsing.pChainl
, UUParsing.pSym.apply1( new Character( 'L' ) )
)
, UUParsing.pAppL.apply2
( UUParsing.pChainr
, UUParsing.pSym.apply1( new Character( 'R' ) )
)
)
, pAnyOps
)
)
) ;
}
// Retrieve the value of an applet parameter
public String getParameter(String key, String def)
{
return isStandalone ? System.getProperty(key, def) :
(getParameter(key) != null ? getParameter(key) : def);
}
// Get info on the applet parameters
public String[][] getParameterInfo()
{
return null;
}
// Get applet information
public String getAppletInfo()
{
return "Applet Information";
}
// Initialize the applet
public void init()
{
try {
initComponents();
}
catch (Exception e) {
e.printStackTrace();
}
}
public void initComponents() throws Exception
{
// IMPORTANT: Source code between BEGIN/END comment pair will be regenerated
// every time the form is saved. All manual changes will be overwritten.
// BEGIN GENERATED CODE
// the following code sets the frame's initial state
labelPriorities.setText("Priorities:");
labelPriorities.setLocation(new java.awt.Point(10, 30));
labelPriorities.setVisible(true);
labelPriorities.setSize(new java.awt.Dimension(60, 20));
textAreaPriorities.setText("(L+-L*/)");
textAreaPriorities.setLocation(new java.awt.Point(80, 30));
textAreaPriorities.setVisible(true);
textAreaPriorities.setSize(new java.awt.Dimension(130, 80));
textAreaPrioErrors.setLocation(new java.awt.Point(220, 30));
textAreaPrioErrors.setVisible(true);
textAreaPrioErrors.setSize(new java.awt.Dimension(320, 80));
textAreaPrioErrors.setEditable(false);
labelErrors.setText("Errors:");
labelErrors.setLocation(new java.awt.Point(220, 10));
labelErrors.setVisible(true);
labelErrors.setSize(new java.awt.Dimension(90, 20));
labelExpression.setText("Expression:");
labelExpression.setLocation(new java.awt.Point(10, 130));
labelExpression.setVisible(true);
labelExpression.setSize(new java.awt.Dimension(60, 20));
textAreaExpression.setText("3*4-6");
textAreaExpression.setLocation(new java.awt.Point(80, 130));
textAreaExpression.setVisible(true);
textAreaExpression.setSize(new java.awt.Dimension(130, 70));
textAreaExprErrors.setLocation(new java.awt.Point(220, 130));
textAreaExprErrors.setVisible(true);
textAreaExprErrors.setSize(new java.awt.Dimension(320, 70));
textAreaExprErrors.setEditable(false);
labelTiming.setText("Timing:");
labelTiming.setLocation(new java.awt.Point(10, 250));
labelTiming.setVisible(true);
labelTiming.setSize(new java.awt.Dimension(60, 20));
textFieldTiming.setLocation(new java.awt.Point(80, 250));
textFieldTiming.setVisible(true);
textFieldTiming.setSize(new java.awt.Dimension(460, 30));
textFieldTiming.setEditable(false);
labelExprResult.setText("Result:");
labelExprResult.setLocation(new java.awt.Point(10, 210));
labelExprResult.setVisible(true);
labelExprResult.setSize(new java.awt.Dimension(60, 20));
textFieldExprResult.setLocation(new java.awt.Point(80, 210));
textFieldExprResult.setVisible(true);
textFieldExprResult.setSize(new java.awt.Dimension(130, 30));
textFieldExprResult.setEditable(false);
setLocation(new java.awt.Point(0, 0));
setLayout(null);
setSize(new java.awt.Dimension(550, 300));
add(labelPriorities);
add(textAreaPriorities);
add(textAreaPrioErrors);
add(labelErrors);
add(labelExpression);
add(textAreaExpression);
add(textAreaExprErrors);
add(labelTiming);
add(textFieldTiming);
add(labelExprResult);
add(textFieldExprResult);
textAreaPriorities.addTextListener(new java.awt.event.TextListener() {
public void textValueChanged(java.awt.event.TextEvent e) {
textAreaPrioritiesTextValueChanged(e);
}
});
textAreaExpression.addTextListener(new java.awt.event.TextListener() {
public void textValueChanged(java.awt.event.TextEvent e) {
textAreaExpressionTextValueChanged(e);
}
});
// END GENERATED CODE
}
// Standard method to start the applet
public void start()
{
handleChangedPrios() ;
}
// Standard method to stop the applet
public void stop()
{
}
// Standard method to destroy the applet
public void destroy()
{
}
// Main entry point when running standalone
public static void main(String[] args)
{
PrioExprApplet applet = new PrioExprApplet();
applet.isStandalone = true;
Frame frame = new Frame();
frame.setTitle("Applet Frame");
frame.add( applet, BorderLayout.CENTER );
applet.init();
applet.start();
frame.setSize( 550, 320 );
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
frame.setLocation( (d.width - frame.getSize().width) / 2,
(d.height - frame.getSize().height) / 2);
frame.setVisible( true );
}
private void handleChangedExpr()
{
resetTiming() ;
reEvalExpr() ;
setTiming() ;
}
private void handleChangedPrios()
{
resetTiming() ;
reEvalPrios() ;
setTiming() ;
}
public void textAreaPrioritiesTextValueChanged(java.awt.event.TextEvent e)
{
handleChangedPrios() ;
}
public void textAreaExpressionTextValueChanged(java.awt.event.TextEvent e)
{
handleChangedExpr() ;
}
}