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

Parsing 噪声数据流上的ANTLR第3部分,parsing,antlr,grammar,text-parsing,Parsing,Antlr,Grammar,Text Parsing,仍在学习ANTLR的过程中。。。最近我发布了两个关于解析一些文本和提取信息的问题,将“不需要的”单词或字符放在一边。在与Bart Kiers进行了一次非常有趣的讨论之后,我又遇到了一个问题 原来,我的语法是这样的 VERB : 'SLEEPING' | 'WALKING'; SUBJECT : 'CAT'|'DOG'|'BIRD'; INDIRECT_OBJECT : 'CAR'| 'SOFA'; ANY2 :'A'..'Z'+ {s

仍在学习ANTLR的过程中。。。最近我发布了两个关于解析一些文本和提取信息的问题,将“不需要的”单词或字符放在一边。在与Bart Kiers进行了一次非常有趣的讨论之后,我又遇到了一个问题

原来,我的语法是这样的

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  
  ;    
一句话,如“现在是晚上10点,懒猫正在电视机前的沙发上酣睡。”将产生以下结果

这很好。。。它做了我想做的,即只提取单词
CAT
sleep
SOFA
,而不提取其他单词。现在,出于另一个原因,我需要在语法中引入一个新的标记,我们称它为
OTHER:'PLANE'
。稍后将由另一个规则使用。我仍然希望我的主要规则起作用:
主语动词间接\宾语
。假设标记
'PLANE'
出现在我的句子中,如

现在是晚上10点,飞机上的懒猫正在电视机前的沙发上睡得很沉。
这将产生以下错误(这并不奇怪,因为lexer对“飞机”有一个明确的定义)



有没有办法告诉ANTLR,如果我输入规则
sentenceParts
,我只关心我定义的3个标记,即
主语
动词
间接宾语
,即使它遇到不同的标记,也不要考虑它?我希望能够做到这一点,而不必将
其他?
放在该规则的任何地方

有没有办法告诉ANTLR,如果我输入规则句子部分,我只关心我定义的3个标记,即主语、动词或间接宾语,即使它遇到不同的标记,也不考虑它?我希望能够做到这一点,而不把其他?这条规则到处都是

没有


您可以忽略标记,也可以不忽略标记,在这种情况下,您必须在解析器规则中将其设置为可选的。

事实上,我可能已经找到了一种方法来做到这一点。。。虽然如果您不想解析令牌,那么在这一点上引入令牌是值得怀疑的,但此解决方案可以工作:

动词:“睡觉”、“走路”; 主题:“猫”、“狗”、“鸟”; 间接对象:“汽车”、“沙发”; 其他:"飞机";; 其他2:'美丽'; 其他3:‘沉重’; ANY2:'A'..'Z'+{skip();}; 任何:。{skip();}

解析 :句子部分+EOF ;

下一步:(选项{greedy=false;}:.)*

句子部分
:主语下一个动词下一个间接\u宾语
;



这将在下面的句子中产生<代码>现在是晚上10点,美丽飞机上的懒猫正在电视机前的沙发上沉重地睡觉下面的树。。。因此,中间令牌


是的,这有点奇怪。请注意,如果您在规则中添加了两个
next
,而不是
OTHER?
,这其实并不重要。老实说,我认为这一切都相当混乱。也许你可以解释一下你在这里真正想做什么,因为我觉得你只是在解释你真正问题的一个非常简单的版本。嗨,巴特,你完全正确。正如你所说,我正在处理一个更复杂的问题。我正在医学领域做一些研究,并筛选不同的报告。问题是,文件中没有真正的结构。我需要了解一些非常具体的情况,比如“患者X,45岁,患有bla bla bla bla bla,胆固醇含量为每毫升血液0.65-0.85……”等等。显然,有很多数字和混乱的数据我不在乎。我只想以年龄,胆固醇,0.65-0.85结束。。。但我会以一种无组织的方式标记所有其他数字或密钥标记…嗯,这会很棘手。您可能需要搜索一下现有的NLP解析器。如果你对它感到满意,你也可以发布一些迄今为止你遇到的困难的“现实世界”例子,或者至少是一些非常接近的例子:也许我(或其他人)可以建议一些比你现在走的路更合适的东西(在我看来,这不会很有成效)。祝你好运!我将尝试提供一些真实的例子。只要一个简单的问题,是否可以定义两个不同的词法,并在一个语法中使用它们?谢谢你,我不知道。不过,您可能希望查看“孤岛语法”wiki条目: 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
;