public class Arithmetic {
String [] SourceCodes = new String[10];
String SourceCode;
Arithmetic (String [] argv) {
int i;
try {
Prog prg = new Prog (argv[0]);
}
catch (ArrayIndexOutOfBoundsException e) {
System.out.println ("You must give at least one argument");
}
}
public class Prog {
Prog (String SourceCode1) {
SourceCode = SourceCode1;
NotTerminal nt = new NotTerminal();
printtree(nt.squnce());
}
}
void printtree (NotTerminal t) {
if (t != null) {
System.out.print ("<ul>");
if (t.Terminal1 != null) {
System.out.print (t.Terminal1);
}
if (t.Terminal2 != null) {
System.out.print (t.Terminal2);
}
if (t.Terminal3 != null) {
System.out.print (t.Terminal3);
}
if (t.Terminal4 != null) {
System.out.print (t.Terminal4);
}
if (t.Terminal5 != null) {
System.out.print (t.Terminal5);
}
if (t.Terminal6 != null) {
System.out.print (t.Terminal6);
}
if (t.Terminal7 != null) {
System.out.print (t.Terminal7);
}
if (t.Terminal8 != null) {
System.out.print (t.Terminal7);
}
System.out.println ();
System.out.println ();
if (t.NotTerminal1 != null) {
System.out.print ("<li>");
printtree (t.NotTerminal1);
System.out.print ("</li>");
}
if (t.NotTerminal2 != null) {
System.out.print ("<li>");
printtree (t.NotTerminal2);
System.out.print ("</li>");
}
if (t.NotTerminal3 != null) {
System.out.print ("<li>");
printtree (t.NotTerminal3);
System.out.print ("</li>");
}
System.out.print ("</ul>");
}
}
int count = 0;
public class NotTerminal {
NotTerminal NotTerminal1;
NotTerminal NotTerminal2;
NotTerminal NotTerminal3;
String Terminal1;
String Terminal2;
String Terminal3;
String Terminal4;
String Terminal5;
String Terminal6;
String Terminal7;
String Terminal8;
NotTerminal() {
this.NotTerminal1 = null;
}
int getCount() {
return count;
}
void setCount(int count2) {
count = count2;
}
boolean isplus() {
if (SourceCode.length() <= count)
return false;
if(SourceCode.charAt(count) == '+') {
count++;
return true;
}
return false;
}
boolean ismult() {
if (SourceCode.length() <= count)
return false;
if(SourceCode.charAt(count) == '*') {
count++;
return true;
}
return false;
}
boolean isopenroundbracket() {
if (SourceCode.length() <= count)
return false;
if(SourceCode.charAt(count) == '(') {
count++;
return true;
}
return false;
}
boolean isclosedroundbracket() {
if (SourceCode.length() <= count)
return false;
if(SourceCode.charAt(count) == ')') {
count++;
return true;
}
return false;
}
boolean issemicolon () {
if (SourceCode.length() <= count)
return false;
if(SourceCode.charAt(count) == ';') {
count++;
return true;
}
return false;
}
boolean isset () {
if (SourceCode.length() <= count+1)
return false;
if((SourceCode.charAt(count) == ':') && (SourceCode.charAt(count+1) == '=')) {
count+=2;
return true;
}
return false;
}
boolean isprint () {
if (SourceCode.length() <= (count + "print".length()))
return false;
if(SourceCode.substring(count, count + "print".length()).equals("print")) {
count += "print".length();
return true;
}
return false;
}
boolean isreturn () {
if (SourceCode.length() <= (count + "return".length()))
return false;
if(SourceCode.substring(count, count + "return".length()).equals("return")) {
count += "return".length();
return true;
}
return false;
}
boolean iswhile () {
if (SourceCode.length() <= (count + "WHILE".length()))
return false;
if(SourceCode.substring(count, count + "WHILE".length()).equals("WHILE")) {
count += "WHILE".length();
return true;
}
return false;
}
boolean isdo () {
if (SourceCode.length() <= (count + "DO".length()))
return false;
if(SourceCode.substring(count, count + "DO".length()).equals("DO")) {
count += "DO".length();
return true;
}
return false;
}
boolean isthen () {
if (SourceCode.length() <= (count + "THEN".length()))
return false;
if(SourceCode.substring(count, count + "THEN".length()).equals("THEN")) {
count += "THEN".length();
return true;
}
return false;
}
boolean isif() {
if (SourceCode.length() <= (count + "IF".length()))
return false;
if(SourceCode.substring(count, count + "IF".length()).equals("IF")) {
count += "IF".length();
return true;
}
return false;
}
boolean iselse() {
if (SourceCode.length() <= (count + "ELSE".length()))
return false;
if(SourceCode.substring(count, count + "ELSE".length()).equals("ELSE")) {
count += "ELSE".length();
return true;
}
return false;
}
boolean isbegin() {
if (SourceCode.length() <= (count + "BEGIN".length()))
return false;
if(SourceCode.substring(count, count + "BEGIN".length()).equals("BEGIN")) {
count += "BEGIN".length();
return true;
}
return false;
}
boolean isend() {
if (SourceCode.length() <= (count + "END".length()))
return false;
if(SourceCode.substring(count, count + "END".length()).equals("END")) {
count += "END".length();
return true;
}
return false;
}
String isconst () {
String str = "";
if (SourceCode.length() <= count)
str = null;
if (!((SourceCode.charAt(count) >= '0') && (SourceCode.charAt(count) <= '9')))
str = null;
if (count < SourceCode.length()) {
while ((SourceCode.charAt(count) >= '0') && (SourceCode.charAt(count) <= '9')) {
str = str + Character.toString(SourceCode.charAt(count));
count++;
if (count >= SourceCode.length())
break;
}
}
return str;
}
String isvarname () {
String str = "";
if (SourceCode.length() <= count)
return null;
if (!((SourceCode.charAt(count) >= 'a') && (SourceCode.charAt(count) <= 'z')))
return null;
str = Character.toString(SourceCode.charAt(count));
count++;
return str;
}
String iscop () {
String str = "";
if ((count+1) < (SourceCode.length())) {
if ((SourceCode.charAt(count) == '<') && (SourceCode.charAt(count+1) == '=')) {
count+=2;
str = "<=";
}
else if ((SourceCode.charAt(count) == '>') && (SourceCode.charAt(count+1) == '=')) {
count+=2;
str = ">=";
}
else if ((SourceCode.charAt(count) == '=') && (SourceCode.charAt(count+1) == '=')) {
count+=2;
str = "==";
}
else if ((SourceCode.charAt(count) == '!') && (SourceCode.charAt(count+1) == '=')) {
count+=2;
str = "!=";
}
else if ((SourceCode.charAt(count) == '=')) {
count+=1;
str = "=";
}
else if (SourceCode.charAt(count) == '<') {
count+=1;
str = "<";
}
else if (SourceCode.charAt(count) == '>') {
count+=1;
str = ">";
}
else
str = null;
}
else if (SourceCode.length() <= count) {
return null;
}
else {
if (SourceCode.charAt(count) == '=')
str = "=";
else if (SourceCode.charAt(count) == '<')
str = "<";
else if (SourceCode.charAt(count) == '>')
str = ">";
else
str = null;
count++;
}
return str;
}
NotTerminal boolexpr () {
String cop;
NotTerminal nt = new NotTerminal();
if ((nt.NotTerminal1 = numexpr()) == null)
return null;
if ((cop = iscop ()) != null) {
if ((nt.NotTerminal2 = numexpr()) != null) {
nt.Terminal1 = "boolexpr";
nt.Terminal2 = cop;
return nt;
}
return null;
}
return null;
}
NotTerminal squnce () {
NotTerminal nt = new NotTerminal();
if((nt.NotTerminal1 = stmnt()) == null)
return null;
if (issemicolon()) {
nt.Terminal1 = "squnce";
nt.Terminal2 = ";";
if((nt.NotTerminal2 = squnce()) != null)
return nt;
}
return nt;
}
NotTerminal assgnmnt () {
NotTerminal nt = new NotTerminal();
String varnam;
if ((varnam = isvarname()) != null) {
nt.Terminal2 = varnam;
if (isset()) {
nt.Terminal3 = ":=";
if((nt.NotTerminal3 = numexpr()) != null) {
nt.Terminal1 = "assgnment";
return nt;
}
}
}
return null;
}
NotTerminal loop () {
NotTerminal nt = new NotTerminal();
if (iswhile()) {
nt.Terminal1 = "WHILE";
if((nt.NotTerminal1 = boolexpr()) != null) {
if (isdo()) {
nt.Terminal2 = "DO";
if (isbegin()) {
nt.Terminal3 = "BEGIN";
if ((nt.NotTerminal2 = squnce()) != null) {
if (isend()) {
nt.Terminal4 = "loop";
return nt;
}
}
}
}
}
}
return null;
}
NotTerminal cond () {
NotTerminal nt = new NotTerminal();
if (isif()) {
nt.Terminal1 = "IF";
if((nt.NotTerminal1 = boolexpr()) != null) {
if (isthen()) {
nt.Terminal2 = "THEN";
if (isbegin()) {
nt.Terminal3 = "BEGIN";
if ((nt.NotTerminal2 = squnce()) != null) {
if (isend()) {
nt.Terminal4 = "END";
if (iselse()) {
nt.Terminal5 = "ELSE";
if (isbegin()) {
nt.Terminal6 = "BEGIN";
if ((nt.NotTerminal3 = squnce()) != null) {
nt.Terminal7 = "END";
nt.Terminal8 = "cond";
return nt;
}
}
}
}
}
}
}
}
}
return null;
}
NotTerminal stmnt () {
NotTerminal nt = new NotTerminal();
if (isprint()) {
nt.Terminal1 = "PRINT";
if ((nt.NotTerminal1 = numexpr()) != null) {
nt.Terminal2 = "stmnt";
return nt;
}
}
else if (isreturn()) {
nt.Terminal1 = "RETURN";
if ((nt.NotTerminal1 = numexpr()) != null) {
nt.Terminal2 = "stmnt";
return nt;
}
}
else if ((nt.NotTerminal2 = assgnmnt()) != null) {
nt.Terminal1 = "stmnt";
return nt;
}
else if ((nt.NotTerminal2 = loop()) != null) {
nt.Terminal1 = "stmnt";
return nt;
}
else if ((nt.NotTerminal2 = cond()) != null) {
nt.Terminal1 = "stmnt";
return nt;
}
return null;
}
NotTerminal numexpr () {
NotTerminal nt = new NotTerminal();
if ((nt.NotTerminal1 = term()) != null) {
if (isplus()) {
if ((nt.NotTerminal2 = numexpr()) != null) {
nt.Terminal1 = "numexpr +";
return nt;
}
return null;
}
return nt;
}
return null;
}
NotTerminal term () {
NotTerminal nt = new NotTerminal();
if ((nt.NotTerminal1 = factor()) != null) {
if (ismult()) {
if ((nt.NotTerminal2 = term()) != null) {
nt.Terminal1 = "term *";
return nt;
}
return null;
}
return nt;
}
return null;
}
NotTerminal factor () {
String str;
NotTerminal nt = new NotTerminal();
if (isopenroundbracket()) {
nt.Terminal1 = "(";
if ((nt.NotTerminal1 = numexpr()) != null) {
if (isclosedroundbracket()) {
nt.Terminal2 = "factor";
nt.Terminal3 = ")";
return nt;
}
else
System.out.println ("Error");
}
return null;
}
else if ((str = isconst()) != null) {
nt.Terminal2 = "const";
nt.Terminal3 = str;
return nt;
}
else if ((str = isvarname()) != null) {
nt.Terminal2 = "varname";
nt.Terminal3 = str;
return nt;
}
else
System.out.println ("Error");
return null;
}
}
}