http://kmlinux.fjfi.cvut.cz/~culikzde/sos/Lexer.zip
package example;
public class Arit {
public String name;
public Arit left;
public Arit middle;
public Arit right;
public Arit (String name0) { name = name0; }
public String toString () { return name; }
}
package example;
import static com.sun.corba.se.impl.util.Utility.printStackTrace;
public class Lexer {
public String token;
public static final int eos = 0; // end of source
public static final int ident = 1;
public static final int number = 2;
public static final int separator = 3;
public int kind;
public Lexer (String input)
{
source = input;
pos = 0;
len = source.length();
line = 1;
col = 0;
nextChar ();
nextToken ();
}
private String source;
private int pos;
private int len;
private char inpCh;
private int line;
private int col;
private static final char zero = 0;
private void nextChar ()
{
if (pos < len)
{
inpCh = source.charAt(pos);
pos ++;
}
else
{
inpCh = zero;
}
if (inpCh == '\n')
{
line ++;
col = 0;
}
else
{
col ++;
}
}
public void nextToken ()
{
while (isSpace (inpCh)) nextChar ();
if (isLetter (inpCh))
{
kind = ident;
token = "";
while (isLetter(inpCh) || isDigit (inpCh))
{
token = token + inpCh;
nextChar ();
}
}
else if (isDigit (inpCh))
{
kind = number;
token = "";
while (isDigit (inpCh))
{
token = token + inpCh;
nextChar ();
}
}
else if (inpCh != zero)
{
kind = separator;
token = "" + inpCh;
nextChar ();
}
else
{
kind = eos;
token = "";
}
String s = "line: " + line +
", column: " + col +
", inpCh: " + inpCh +
", token: " + token +
", kind: " + kind ;
System.out.println (s);
}
private boolean isSpace (char c)
{
return c <= ' ' && c != zero;
}
private boolean isLetter (char c)
{
return c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '_';
}
private boolean isDigit (char c)
{
return c >= '0' && c <= '9';
}
/* ---- */
public void error (String s)
{
s = s + ", line: " + line +
", column: " + col +
", inpCh: " + inpCh +
", token: " + token +
", kind: " + kind ;
printStackTrace();
throw new RuntimeException (s);
}
private final String quote = "\"";
public boolean isSeparator (String s)
{
return kind == separator && token.equals (s);
}
public void checkSeparator (String s)
{
if (isSeparator(s))
nextToken();
else
error (quote + s + quote + " expected");
}
public boolean isKeyword (String s)
{
return kind == ident && token.equals (s);
}
public void checkKeyword (String s)
{
if (isKeyword(s))
nextToken();
else
error (quote + s + quote + " expected");
}
}
package example;
public class Parser extends Lexer {
public Parser (String input)
{
super (input);
}
public Arit factor ()
{
Arit result = null;
if (isSeparator("("))
{
nextToken (); // preskocit (
result = expr ();
checkSeparator (")");
}
else if (kind == ident || kind == number)
{
result = new Arit (token);
nextToken ();
}
else
error ("Identifier or number or sub-expression expected");
return result;
}
public Arit term ()
{
Arit result = factor ();
while (isSeparator ("*") || isSeparator ("/"))
{
Arit temp = result;
result = new Arit (token);
nextToken();
result.left = temp;
result.right = factor ();
}
return result;
}
public Arit simpleExpr ()
{
Arit result = term ();
while (isSeparator ("+") || isSeparator ("-"))
{
Arit temp = result;
result = new Arit (token);
nextToken();
result.left = temp;
result.right = term ();
}
return result;
}
public Arit expr ()
{
Arit result = simpleExpr ();
if (isSeparator ("="))
{
Arit temp = result;
result = new Arit (token);
nextToken();
result.left = temp;
result.right = expr ();
}
return result;
}
public Arit ifStatement ()
{
checkKeyword("if");
Arit result = new Arit ("if");
checkSeparator ("(");
result.left = expr (); // condition
checkSeparator (")");
result.middle = statement (); // then statement
if (isKeyword ("else"))
{
nextToken (); // preskocit else
result.right = statement (); // else statement
}
return result;
}
public Arit whileStatement ()
{
checkKeyword("while");
Arit result = new Arit ("while");
checkSeparator ("(");
result.left = expr (); // condition
checkSeparator (")");
result.middle = statement (); // then statement
return result;
}
public Arit statement ()
{
Arit result = null;
if (isKeyword ("if"))
result = ifStatement();
else if (isKeyword ("while"))
result = whileStatement();
else
{
result = expr ();
checkSeparator(";");
}
return result;
}
}
package example;
import java.util.*;
import java.lang.reflect.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.table.*;
public class Window extends javax.swing.JFrame {
public Window() {
initComponents();
}
private void run ()
{
Parser p = new Parser (input.getText ());
output.setText ("");
try
{
Arit a = p.statement();
displayTree (a);
output.append("O.K.");
}
catch (RuntimeException ex)
{
output.append(ex.toString ());
}
}
DefaultTreeModel m;
private void displayTree (Arit a)
{
DefaultMutableTreeNode root = displayBranch (a) ;
m = new DefaultTreeModel (root);
tree.setModel (m);
}
private DefaultMutableTreeNode displayBranch (Arit a)
{
DefaultMutableTreeNode node = new DefaultMutableTreeNode (a);
if (a.left != null)
node.add (displayBranch (a.left)) ;
if (a.middle != null)
node.add (displayBranch (a.middle)) ;
if (a.right != null)
node.add (displayBranch (a.right)) ;
return node;
}
DefaultTableModel tm;
private void displayTable (Object obj)
{
Vector columns = new Vector ();
columns.add ("Name");
columns.add ("Value");
Vector data = new Vector ();
Class cls = obj.getClass();
for (Field field : cls.getFields())
{
String name = field.getName ();
String value = "";
try
{
Object answer = field.get (obj);
if (answer != null)
value = answer.toString();
}
catch (IllegalArgumentException ex) { }
catch (IllegalAccessException ex) { }
Vector line = new Vector ();
line.add (name);
line.add (value);
data.add (line);
}
tm = new DefaultTableModel (data, columns);
table.setModel (tm);
}
private void runButtonActionPerformed(java.awt.event.ActionEvent evt) {
run ();
}
private void treeValueChanged(javax.swing.event.TreeSelectionEvent evt) {
TreePath[] paths = evt.getPaths();
for (TreePath path : paths)
if (evt.isAddedPath(path))
{
Object obj = path.getLastPathComponent();
if (obj instanceof DefaultMutableTreeNode)
{
DefaultMutableTreeNode node = (DefaultMutableTreeNode) obj;
displayTable (node.getUserObject());
}
}
}
private void runMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
run ();
}
}