2013-10-26 43 views
1

希望我的標題不是完全可怕的。我真的不知道應該調用什麼。我正在嘗試用Java編寫一個非常基本的方案解析器。我遇到的問題是實施。Java,如何將一部分令牌識別爲單獨的令牌?

我打開一個文件,我想分析單獨的標記:

while(sc.hasNext()) {   
    System.out.println(sc.next()); 
} 

一般來說,要獲得令牌,這是好的。但在方案中,識別列表的開始和結束是至關重要的;我的程序的功能依賴於這一點,所以我需要一種方法來治療令牌如:

(define 

poly)) 

由於多個令牌,其中任何括號是它自己的令牌:

(
define 
poly 
) 
) 

如果我能做到這一點,我可以正確識別不同的符號添加到我的symtab,並知道何時/如何將節點添加到我的分析樹。

Java API顯示scanner類沒有任何方法來完成我想要的功能。我能想到的最接近的事情是使用parantheses作爲自定義分隔符,這將使每個標記足夠乾淨以便通過我的邏輯更容易地識別,但是然後我的括號會發生什麼?

我正在考慮的另一種方法是放棄Java tokenizer,並且只是通過字符掃描char,直到找到完整的符號。

我該怎麼辦?試着去解決Java掃描器方法,或者只是逐個字符的方法?

+0

一噸,它不只是空白和parens,但也有各種引號。基於分隔符的掃描不會在那裏工作。 –

+1

SO上的相關帖子:http:// stackoverflow。com/questions/17376475/antlr-grammar-for-scheme-r5rs,http://stackoverflow.com/questions/6344766/antlr-resolving-non-ll-problems-and-syntactic-predicates/6349009#6349009。 –

+0

@WillNess如果他們不那麼先進,那些鏈接會更有幫助。我正在編寫的程序是編譯器設計的一門精美課程,這在我的大學裏甚至都不是必需的課程。我現在也明白,我不能使用基於分隔符的方法,所以我認爲基於字符的字符是我唯一的選擇... – GrinReaper

回答

1

首先,您需要弄清楚術語。 (define不是一個單一的標記;它是一個(令牌,然後是define之一。同樣,poly))不是一個單一的標記,它是三個。

不要讓java.util.Scanner(這就是你正在使用的權利?)拋出你一個循環 - 當你說「一般來說,爲了得到令牌,這很好」,我說不,它不是。如果它不夠,不要滿足它所提供的東西。

要正確標記Scheme代碼,我希望您至少需要能夠處理常規語言。那真的是非常艱難的使用Scanner做的,所以這裏的幾個選擇:

  • 學習和運用像ANTLR的或萊克斯一個嘗試和真正的分析工具。將有利於您的任何未來的解析項目
  • 滾動您自己的正則表達式方法(我不知道方案很好,以確保這將工作)標記化,但不要忘記,您至少需要上下文-free全解析
  • 瞭解解析器組合和遞歸下降解析,這是比較容易通過手工來實現 - 你最終會學習Java的類型系統