解析-嘈杂的数据流上的ANTLR

我在ANTLR世界中是一个新手,我试图弄清楚如何使用此解析工具来解释一组“嘈杂”字符串.我想实现以下目标.

让我们以这个短语为例:现在是晚上10点,懒惰的CAT目前正在电视前的SOFA上大量睡眠

我想提取的是CAT,SLEEPING和SOFA,它们的语法很容易匹配以下模式:主题-动词-间接对象…在这里我可以定义
动词:“睡眠” | ‘步行’;
主题:“猫” |“狗” |“鸟”;
INDIRECT_OBJECT:“ CAR” | ‘沙发’;
等等.我不想以永久的“ NoViableException”结尾,因为我无法描述语言结构的所有可能性.我只想拆掉无用的单词,只保留那些有趣的单词.
 这更像是如果我有一个标记器,然后问解析器:“好吧,读取流,直到找到一个主题,然后忽略其余内容,直到找到一个动词,依此类推.”

我需要从一个无组织的集合中提取一个有组织的结构……例如,我希望能够进行解释(我并没有判断这种“英语语法”的根本和错误观点的相关性)
主语-动词-间接对象
间接对象​​-主题-动词
所以我会像这样分析句子
现在是晚上10点,而懒惰CAT目前正在电视前的SOFA上大量睡眠,或者现在是晚上10点,并且在电视机前面的SOFA中,Lazy CAT当前正在大量睡眠.

最佳答案
您只能创建几个词法分析器规则(例如,您发布的规则),并且作为最后一个词法分析器规则,您可以匹配任何字符并对其进行skip():

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

顺序在这里很重要:词法分析器尝试从上到下匹配标记,因此,如果它不能与VERB,SUBJECT或INDIRECT_OBJECT的任何标记匹配,则“掉线”到ANY规则并跳过此标记.然后,您可以使用以下解析器规则来过滤您的输入流:

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. The DOG
is WALKING on the SOFA.

如下:

转载注明原文:解析-嘈杂的数据流上的ANTLR - 代码日志