2017-08-29 47 views
0

我很難搞清楚如何識別某些文本,前提是後面跟着某些東西。任務是認識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

回答

0

ANTLR不是這項任務的正確工具。普通的解析器是爲特定的語言而設計的,也就是說,一組由在解析器創建時已知的元素組成的句子。有一些方法可以使這更加靈活,例如通過在謂詞中使用運行時函數來識別未在語法中定義的單詞,但這具有其他(負面)影響。

你應該考慮的是NLP爲不同的方法來處理自然語言。它不僅僅是在兩個已知的標記之間跳過東西。

+0

不同意。在引擎蓋下,NLP使用詞法分析器和分詞器來分析文本。流水線詞法分析器和具有語言特定知識的令牌處理器是NLP如何構建的。我已經在JFlex和JavaCC中做了很多年,現在想升級到Antlr。 – ccleve