【发布时间】:2011-12-28 11:34:48
【问题描述】:
我正在使用 ANTLR 编写 PDF 对象结构的解析器,但在解析混合了 PDF Reference 和 Integer 的字符串流时遇到了问题。
基本上,PDF 参考是这样的字符串:“10 0 R”(INTEGER SPACE INTEGER SPACE ‘R’)。
这是我的语法文件(简体):
grammar Pdf;
options {
language=CSharp3;
backtrack=true;
}
public r returns [string val]
: ref {$val = $r.text;}
| INTEGER {$val = $r.text;}
;
ref
: INTEGER SPACE INTEGER SPACE 'R';
INTEGER
: DIGIT+;
SPACE: ' ';
fragment DIGIT
: '0'..'9'
;
这是测试代码(C#):
byte[] bytes = Encoding.ASCII.GetBytes("97 98 10 0 R 100 101");
MemoryStream stream = new MemoryStream(bytes);
ANTLRInputStream inputStream = new ANTLRInputStream(stream);
PdfLexer lexer = new PdfLexer(inputStream);
CommonTokenStream tokens = new CommonTokenStream(lexer);
PdfParser parser = new PdfParser(tokens);
string result = parser.r();
我希望结果是规则 r 中匹配的第一个规则(无论是 ref 还是 INTEGER)。
例如:
如果输入=“97 98 10 0 R 100 101”:结果=“97”
如果输入=“10 0 R 100 101”:结果=“10 0 R”
无需遍历整个字符串流。只需匹配第一条规则,然后停止。
我是 ANTLR 的新手,不知道该怎么做。 我正在使用 ANTLRWorks 1.4.3 和 antlr-dotnet-csharpruntime-3.4.1.9004。
感谢任何帮助!
【问题讨论】: