import java.io.*;
import squirrel.*;

public class SchemeParser implements HasGrammar {
    private Grammar g;
    
    public SchemeParser() {
        g = new Grammar();
        g.importFrom(new Standard());
        g.addRule("<list>", "( [<listbody>] ) [<sep>]");
        g.addRule("<listbody>", "<listitem> [<sep>] [<listbody>]");
        g.addRule("<listitem>", "<quoted>", "<atom>", "<list>");
        g.addRule("<quoted>", "' <atom>");
        
        g.addToken("<atom>", "<atomchar> [<atom>]");
        g.addToken("<atomchar>", "<alphanumeric>", "<symsym>");
        g.addToken("<sep>", "<comment>", "<sp>");
        g.addToken("<comment>", "; [<commentChars>] <newline>");
        g.addToken("<commentChars>", "!<newline> <any> [<commentChars>]");
        
        g.addCharClass("<symsym>", '!', '@', '#', '$','%','&','*','-','+',
            '=','\\',':',',','.','?','<','>','/');
        g.addCharClass("<newline>", '\n');
    }
    
    public Grammar getGrammar() {return g;}
    
    public Tree parse(Object obj) throws IOException {
        Parser p = new Parser(g, obj);
        p.parse();
        return p.results().bestTree();
    }
    
    public static void main(String[] args) throws IOException {
        if (args.length < 1) {
            System.out.println("Usage: SchemeParser schemefile1 ...");
        }
        
        SchemeParser sp = new SchemeParser();
        
        for (String filename: args) {
            File f = new File(filename);
            Tree result = sp.parse(f);
            if (result.isError()) {
                System.out.println(result.errorMessage());
            }
            System.out.println(result.textTree());
        }
    }
}
