PARSER_BEGIN(Faq)
import java.io.*;
public class Faq {
static int count = 0;
static int beginAt = 1;
static PrintWriter indstr;
static {
try {
indstr = new PrintWriter(new FileWriter("index.html"));
indstr.println("
Selected list of emails from the JavaCC mailing list");
indstr.println("Selected list of emails from the JavaCC mailing list
");
} catch (IOException e) {
throw new Error();
}
}
static String fix(String s) {
String retval = "";
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == '<') {
retval += "<";
} else if (c == '>') {
retval += ">";
} else {
retval += c;
}
}
return retval;
}
public static void main(String args[]) throws ParseException {
if (args.length == 1) {
beginAt = Integer.parseInt(args[0]);
}
Faq parser = new Faq(System.in);
parser.MailFile();
}
}
PARSER_END(Faq)
// PARSER SPECIFICATIONS BEGIN HERE
void MailFile() :
{
}
{
(
{
count++;
}
MailMessage()
{
System.out.print(count + ".");
System.out.flush();
}
)*
{
System.out.println("");
indstr.close();
}
}
void MailMessage() :
{
PrintWriter msgstr = null;
Token subj=null, from=null, date=null, body;
if (count >= beginAt) {
try {
msgstr = new PrintWriter(new FileWriter(count + ".html"));
} catch (IOException e) {
throw new Error();
}
}
}
{
( subj= | from= | date= )+
{
indstr.print("");
if (subj == null) {
indstr.println("no subject
");
} else {
indstr.println(fix(subj.image) + "
");
}
if (count >= beginAt) {
msgstr.println("" + ((subj==null) ? "no subject" : fix(subj.image)) + "");
msgstr.println("Subject: " + ((subj==null) ? "no subject" : fix(subj.image)) + "
");
msgstr.println("From: " + ((from==null) ? "" : fix(from.image)) + "
");
msgstr.println("Date: " + ((date==null) ? "" : fix(date.image)) + "
");
msgstr.println("
");
}
}
( body=
{
if (count >= beginAt) {
msgstr.print(fix(body.image) + "
");
}
}
)*
{
if (count >= beginAt) {
msgstr.close();
}
}
}
// LEXICAL SPECIFICATIONS BEGIN HERE
TOKEN:
{
<#EOL: "\n" | "\r" | "\r\n">
|
<#TWOEOLS: (("\n"|"\r\n") ) | ("\r\r" [ "\n" ])>
|
<#NOT_EOL: ~["\n","\r"]>
}
SKIP:
{
< "*** EOOH ***" > : MAILHEADER
|
<~[]>
}
SKIP:
{
<_TWOEOLS: > : MAILBODY
// We cannot have just a reference to a regular expression in a
// lexical specification - i.e., we cannot simply have .
|
"Subject: " : MAILSUBJECT
|
"From: " : MAILFROM
|
"Date: " : MAILDATE
|
<~[]>
}
TOKEN:
{
)+>
}
SKIP:
{
<_EOL1: > : MAILHEADER
}
TOKEN:
{
)+>
}
SKIP:
{
<_EOL2: > : MAILHEADER
}
TOKEN:
{
)+>
}
SKIP:
{
<_EOL3: > : MAILHEADER
}
TOKEN:
{
>
|
: DEFAULT
}