2

我是 ANTLR 世界的新手,我正试图弄清楚如何使用这个解析工具来解释一组“嘈杂”的字符串。我想要实现的是以下。

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

我想提取的是CATSLEEPING并且SOFA有一个与以下模式轻松匹配的语法:SUBJECT - VERB - INDIRECT OBJECT ...我可以在其中定义

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

等。我不想以永久的“NoViableException”结束因为我无法描述语言结构的所有可能性。我只想撕掉无用的词,只保留有趣的词。

更像是如果我有一个标记器并询问解析器“好的,阅读流直到找到一个 SUBJECT,然后忽略其余部分,直到找到一个 VERB 等。”

我需要以无组织的方式提取有组织的结构设置...例如,我希望能够解释(我不判断这种完全基本和不正确的观点的相关性 '
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

4

1 回答 1

3

您只能创建几个词法分析器规则(例如,您发布的那些),并且作为最后一个词法分析器规则,您可以匹配任何字符skip()

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

这里的顺序很重要:词法分析器尝试从上到下匹配标记,所以如果它不能匹配任何标记VERB,SUBJECTINDIRECT_OBJECT,它会“落入”ANY规则并跳过这个标记。然后,您可以使用这些解析器规则来过滤您的输入流:

parse
  :  sentenceParts+ EOF
  ;

sentenceParts
  :  SUBJECT VERB INDIRECT_OBJECT
  ;  

它将解析输入文本:

现在是晚上 10 点,懒猫正在 电视机前的沙发上沉睡。狗 在沙发上走。

如下:

替代文字

于 2010-11-30T08:55:10.347 回答