【发布时间】:2012-02-11 17:43:28
【问题描述】:
我正在使用 ANTLRv3 解析如下所示的输入:
* this is an outline item at level 1
** item at level 2
*** item at level 3
* another item at level 1
* an item with *bold* text
行首的星号表示大纲项目的开始。星号也可以是项目文本的一部分(例如*bold*)。
这是在项目文本中不支持星号的情况下解析大纲项目的语法:
outline_item: OUTLINE_ITEM_MARKER ITEM_TEXT;
OUTLINE_ITEM_MARKER: STAR_IN_COLUMN_ZERO STAR* (' '|'\t');
ITEM_TEXT: ('a'..'z'|'A'..'Z'|'0'..'9'|'\r'|'\n'|' '|'\t')+;
fragment STAR_IN_COLUMN_ZERO: {getCharPositionInLine()==0}? '*';
fragment STAR: {getCharPositionInLine()>0}? '*';
对于输入*** foo bar,ANTLR 生成以下解析树:
到目前为止,这按预期工作。现在我正在尝试为项目文本的可能字符添加星号,因此我将 ITEM_TEXT 的词法分析器规则更改为以下内容:
ITEM_TEXT: ('a'..'z'|'A'..'Z'|'0'..'9'|'\r'|'\n'|' '|'\t'|STAR)+;
现在对于相同的输入,生成以下解析树:
这是 ANTLRWorks 中的输出:
input.txt line 1:0 rule STAR failed predicate: {getCharPositionInLine()>0}?
input.txt line 1:1 missing OUTLINE_ITEM_MARKER at '** foo bar'
由于MissingTokenException,OUTLINE_ITEM_MARKER 似乎不匹配。语法有什么问题,我需要更改什么才能让星号成为ITEM_TEXT 的一部分?
【问题讨论】:
标签: parsing exception antlr grammar lexer