我是ANTLR世界的新手,我正在试图弄清楚如何使用这个解析工具来解释一组“嘈杂”的字符串。我想要实现的目标如下。
让我们以这句话为例:It's 10PM and the Lazy CAT is currently SLEEPING heavily on the SOFA in front of the TV
我想要提取的是CAT
,SLEEPING
和SOFA
,并且语法很容易匹配以下模式:SUBJECT - VERB - INDIRECT OBJECT ...我可以在哪里定义
VERB : 'SLEEPING' | 'WALKING';
SUBJECT : 'CAT'|'DOG'|'BIRD';
INDIRECT_OBJECT : 'CAR'| 'SOFA';
等等。我不想最终得到一个永久的“NoViableException”,因为我无法描述语言结构的所有可能性。我只想撕掉无用的单词,只留下有趣的单词
更像是我有一个tokeniser并且问解析器“好的,直到你找到一个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
答案 0 :(得分:3)
您只能创建几个词法规则(例如,您发布的规则),并且作为最后一个词法规则,您可以匹配任何字符并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
;
将解析输入文本:
现在是晚上10点,懒人猫正在睡觉 严重依赖电视机前的SOFA。狗狗 正在SOFA上行走。
如下: