Antlr:lookahead和lookbehind示例

问题描述:

我很难搞清楚如何识别某些文本,前提是后面跟着某些东西。任务是认识AND,OR,和NOT,但如果他们是一个字的一部分:Antlr:lookahead和lookbehind示例

他们应该在这里确认:

x AND y 
(x)AND(y) 
NOT x 
NOT(x) 

但不是在这里:

xANDy 
abcNOTdef 

如果它被空格或括号包围,则会被识别。如果它位于输入的开始处,前面是空格,后面跟着空格或括号,则不会被识别。

麻烦的是,如果我将括号作为AND或NOT定义的一部分,它们会被消耗掉,我需要它们成为单独的标记。

是否有某种可以使用的lookahead/lookbehind语法?

编辑:

%的意见,这里的一些背景。问题与此问题有关:Antlr: how to match everything between the other recognized tokens?我的工作解决方案只是识别AND,OR等,并跳过其他所有内容。然后,在文本的第二遍中,我手动抓取未覆盖的字符,并在其上运行完全不同的标记器。原因是我需要一个定制的,特定于人类语言的标记器来表示这个内容,这意味着我不能提前描述什么是ID。每种人的语言都不一样。我想分阶段地合并一个查询语言标记器,然后将人类语言标记器应用到剩下的部分。

+0

那么'xANDy'和'abcNOTdef'应该如何标记?这些通常被标记为某种标识符标记,在这种情况下,您应该没有问题。关于你想要解析/标记的内容的更多上下文将会非常有帮助。 –

+0

巴特的权利。你没有看到问题。为'AND'和'ID'创建一个规则,其中'ID'匹配您的标识符。在语法中的'ID'规则之前放置关键字规则('AND')。它会在'和'单独出现时匹配(例如,被空格或非空格包围)。否则'ID'匹配并给你任何标识符(甚至包含字母'和'的那些标识符)。 –

+0

上下文添加到我的问题。 – ccleve

ANTLR不是这项任务的正确工具。普通的解析器是为特定的语言而设计的,也就是说,一组由在解析器创建时已知的元素组成的句子。有一些方法可以使这更加灵活,例如通过在谓词中使用运行时函数来识别未在语法中定义的单词,但这具有其他(负面)影响。

你应该考虑的是NLP为不同的方法来处理自然语言。它不仅仅是在两个已知的标记之间跳过东西。

+0

不同意。在引擎盖下,NLP使用词法分析器和分词器来分析文本。流水线词法分析器和具有语言特定知识的令牌处理器是NLP如何构建的。我已经在JFlex和JavaCC中做了很多年,现在想升级到Antlr。 – ccleve