仍处于学习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.
这样的句子会生成以下内容
这很好......它可以做我想要的,即只提取单词CAT
,SLEEPING
和SOFA
,而不考虑其他单词。现在,由于另一个原因,我需要在语法中引入一个新的令牌,我们称之为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'定义作为代币,因此不会出现意外)
有没有办法告诉ANTLR如果我输入规则sentenceParts
我只关心我定义的3个令牌,即SUBJECT
,VERB
或INDIRECT_OBJECT
和即使遇到不同的令牌,也不考虑它?我希望能够在不将OTHER?
放在此规则的任何地方
答案 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
下面的树...那么中介令牌
答案 1 :(得分:0)
有没有办法告诉ANTLR,如果我进入规则句子,我只关心我定义的3个令牌,即SUBJECT,VERB或INDIRECT_OBJECT,即使遇到不同的令牌,也不要把它考虑进去?我希望能够在不放其他的情况下做到这一点?这条规则无处不在
没有
您要么忽略该令牌,要么忽略该令牌,在这种情况下,您必须在解析器规则中将其设为可选。