/*
* 練習問題22.13 p.573
* StreamTokenizerのバージョンと同様に、誤って置かれた=文字を検出するように
* 練習問題22.12の回答を拡張しなさい。
* (ヒント:ある種のトークン間でデリミタパターンを動的に変更してみると良いかも知れません。)
*/
/*
* 練習問題22.12 p.573
* 467頁の属性を読むメソッドをscannerを使用して書き直しなさい。
* この練習問題に関しては、どちらのバージョンも正しくフォーマットされた入力を受け付けるだけで
* よいです。
*/
package ch22.ex22_13;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.Scanner;
public class EX2213
{
public static Attributed readAttrs(Reader source) throws IOException
{
Scanner in = new Scanner(source);
AttributedImpl attrs = new AttributedImpl();
Attr attr = null;
String tmp = null;
in.useDelimiter("#.*\\r\\n|\\r\\n");
while(in.hasNext())
{
tmp = in.next();
Scanner inner = new Scanner(tmp);
inner.useDelimiter("=");
attr = new Attr(inner.next());
inner.useDelimiter("=|#.*\\r\\n|\\r\\n");
if (inner.hasNext())
{
attr.setValue(inner.next());
attrs.add(attr);
}
else
{
throw new IOException("maybe '=' is misplaced");
}
attr = null;
tmp = null;
}
return attrs;
}
public static void main(String[] args)
{
AttributedImpl result = null;
System.out.println("OK pattern");
try
{
result = (AttributedImpl)EX2213.readAttrs(new FileReader("JPL/ch22/ex22_13/test.txt"));
for(Attr tmp: result)
{
System.out.println(tmp.getName() + ": " + tmp.getValue());
}
}
catch(Exception e)
{
System.out.println(e);
}
result = null;
System.out.println("NG pattern");
try
{
result = (AttributedImpl)EX2213.readAttrs(new FileReader("JPL/ch22/ex22_13/bad.txt"));
for(Attr tmp: result)
{
System.out.println(tmp.getName() + ": " + tmp.getValue());
}
}
catch(Exception e)
{
System.out.println(e);
}
}
}