#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
char next;
void P(void);
void E(void);
void T(void);
void S(void);
void F(void);
void error(int);
void scan(void);
void P() {
scan();
E();
if (next != '$') error(1);
else printf("Success\n");
}
void E(void) {
T();
while (next == '+' || next == '-') {
scan();
T();
}
}
void T(void) {
S();
while (next == '*' || next == '/') {
scan();
S();
}
}
void S(void) {
F();
if (next == '^') {
scan();
S();
}
}
void F(void) {
if (isalpha(next)) {
scan();
}
else if (next == '(') {
scan();
E();
if (next == ')') scan();
else error(2);
}
else {
error(3);
}
}
void scan(void) {
while (isspace(next = getchar()))
;
printf("%c", next);
}
void error(int n) {
printf("\nERR#: %i, next: %c\n",
n, next);
exit(1);
}
int main() {
P();
printf("\n");
}
| /* Arith.java: simple parser -- no output
* grammar:
* P ---> E '$'
* E ---> T {('+'|'-') T}
* T ---> S {('*'|'/') S}
* S ---> F '^' S | F
* F ---> char | '(' E ')'
*/
class Arith {
private GetChar getChar = new GetChar();
private char next;
private void P() {
scan();
E();
if (next != '$') error(1);
else System.out.println("Success");
}
private void E() {
T();
while (next == '+' || next == '-') {
scan();
T();
}
}
private void T() {
S();
while (next == '*' || next == '/') {
scan();
S();
}
}
private void S() {
F();
if (next == '^') {
scan();
S();
}
}
private void F() {
if (Character.isLetter(next)) {
scan();
}
else if (next == '(') {
scan();
E();
if (next == ')') scan();
else error(2);
}
else {
error(3);
}
}
private void scan() {
while (Character.isWhitespace(next =
getChar.getNextChar()))
;
}
private void error(int n) {
System.out.println("*** ERROR: " + n);
System.exit(1);
}
public static void main(String[] args) {
Arith arith = new Arith();
arith.P();
}
}
|