我在ANTLR世界中非常新鲜,我正在尝试弄清楚如何使用此解析工具来解释一组“嘈杂”字符串。我想实现的是以下内容。

让我们以这个短语为例: It's 10PM and the Lazy CAT is currently SLEEPING heavily on the SOFA in front of the TV

我想提取的是 CAT, SLEEPINGSOFA 并具有易于匹配以下模式的语法:主题 - 动词 - 间接对象...我可以定义

VERB : 'SLEEPING' | 'WALKING';
SUBJECT : 'CAT'|'DOG'|'BIRD';
INDIRECT_OBJECT : 'CAR'| 'SOFA';

等等。我不想以永久的“ Noviable Exception”结束,因为我无法描述语言结构的所有可能性。我只想撕开无用的单词,只保留一个有趣的话。

这更像是我有一个令牌者,问解析器“好吧,请阅读流直到找到主题,然后忽略其余的,直到找到动词等。”

我需要在一个不组织的集合中提取有组织的结构...例如,我想解释(我没有判断这种完全基本的和不正确的“英语语法”的观点)
SUBJECT - VERB - INDIRECT OBJECT
INDIRECT OBJECT - SUBJECT - VERB

所以我会解析句子

It's 10PM and the Lazy CAT is currently SLEEPING heavily on the SOFA in front of the TV

或者

It's 10PM and, on the SOFA in front of the TV, the Lazy CAT is currently SLEEPING heavily

有帮助吗?

解决方案

您只能创建几个Lexer规则(例如,您发布的规则),作为最后的Lexer规则,您可以匹配任何字符和 skip() 它:

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

该顺序在这里很重要:Lexer试图将令牌从上到下匹配,因此,如果它无法匹配任何令牌 VERB, SUBJECT 或者 INDIRECT_OBJECT, ,它“通过”到 ANY 统治并跳过这个令牌。然后,您可以使用这些解析器规则来过滤您的输入流:

parse
  :  sentenceParts+ EOF
  ;

sentenceParts
  :  SUBJECT VERB INDIRECT_OBJECT
  ;  

这将解析输入文本:

晚上10点,懒猫目前正在睡觉 在电视前面的沙发上很重。狗 在沙发上行走。

如下:

alt text

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top