噪声数据流上的ANTLR第3部分

时间:2010-12-03 10:57:45

标签: parsing antlr grammar text-parsing

仍处于学习ANTLR的过程中...最近,我发布了2个关于解析某些文本和提取信息的问题,而忽略了“不需要的”单词或字符。在与Bart Kiers on parsing a noisy datastream Part 1 and parsing a noisy datastream Part 2进行了非常积极的讨论后,我最终又遇到了一个问题......

最初,我的语法看起来像这样

VERB            : 'SLEEPING' | 'WALKING';
SUBJECT         : 'CAT'|'DOG'|'BIRD'; 
INDIRECT_OBJECT : 'CAR'| 'SOFA';
ANY2            :'A'..'Z'+ {skip();};
ANY             : . {skip();};

parse 
  :  sentenceParts+ EOF 
  ;

sentenceParts  
  :  SUBJECT VERB INDIRECT_OBJECT  
  ;    

it's 10PM and the Lazy CAT is currently SLEEPING heavily on the SOFA in front of the TV.这样的句子会生成以下内容

alt text

这很好......它可以做我想要的,即只提取单词CATSLEEPINGSOFA,而不考虑其他单词。现在,由于另一个原因,我需要在语法中引入一个新的令牌,我们称之为OTHER : 'PLANE'。稍后将由另一个规则使用它。我仍然希望我的主要规则有效:SUBJECT VERB INDIRECT_OBJECT。假设令牌'PLANE'出现在我的句子中,如

it's 10PM and the Lazy CAT on the PLANE is currently SLEEPING heavily on the SOFA in front of the TV.它会产生以下错误(因为词法分析器有一个明确的'PLANE'定义作为代币,因此不会出现意外)

alt text



有没有办法告诉ANTLR如果我输入规则sentenceParts我只关心我定义的3个令牌,即SUBJECTVERBINDIRECT_OBJECT和即使遇到不同的令牌,也不考虑它?我希望能够在不将OTHER?放在此规则的任何地方

的情况下做到这一点

2 个答案:

答案 0 :(得分:1)

事实上,我可能已经找到了一种方法来做到这一点......虽然如果你不想解析它们,引入令牌是值得怀疑的,但这个解决方案有效:

VERB            : 'SLEEPING' | 'WALKING';
SUBJECT         : 'CAT'|'DOG'|'BIRD'; 
INDIRECT_OBJECT : 'CAR'| 'SOFA';
OTHER       : 'PLANE';
OTHER2      : 'BEAUTIFUL';
OTHER3      : 'HEAVILLY';
ANY2            :'A'..'Z'+ {skip();};
ANY             : . {skip();};

parse : sentenceParts+ EOF ;

next : ( options {greedy=false;}: .)*;

sentenceParts
: SUBJECT next VERB next INDIRECT_OBJECT
;



这将产生以下句子it's 10PM and the Lazy CAT on the BEAUTIFUL PLANE is currently SLEEPING HEAVILLY on the SOFA in front of the TV下面的树...那么中介令牌

alt text

答案 1 :(得分:0)

  

有没有办法告诉ANTLR,如果我进入规则句子,我只关心我定义的3个令牌,即SUBJECT,VERB或INDIRECT_OBJECT,即使遇到不同的令牌,也不要把它考虑进去?我希望能够在不放其他的情况下做到这一点?这条规则无处不在

没有

您要么忽略该令牌,要么忽略该令牌,在这种情况下,您必须在解析器规则中将其设为可选。