2016-07-12 37 views
2

我有一個很久以前由其他人創建的yacc文件。該文件描述了一種自定義語言。我的目標是使用該yacc文件爲我的Java應用程序中的自定義文本區域創建解析器。當語法不正確時,最終目的是顯示錯誤。 我目前正在使用RSyntaxTextArea,它很好地處理突出顯示(基於我自己的實現,而不是yacc文件),但創建一個可以檢測用戶可能發生的每個可能錯誤的解析器是一項非常困難的任務。使用yacc文件檢測Java中文本區域的語法錯誤

我看到它的方式,我有三個選擇:

  1. 最理想的情況是,如果以某種方式,我可以在我的Java應用程序中使用YACC文件我有直接。

  2. 第二種最好的情況是,如果有辦法將yacc文件解析爲我可以在Java中輕鬆使用的格式。我發現BYACC/J從yacc文件創建了一個Java類,但是我得到的文件充斥着語法錯誤(缺少的函數,變量等),所以沒有太好的工作。

  3. 正如我所看到的,第三個選擇是學習YACC和另一個我可以在Java中使用的解析器生成器,並重寫整個事情。學習新事物從來不是一件壞事,但由於我的時間不是無窮無盡,這些「編譯器編譯器」似乎有一個相當陡峭的學習曲線,我只想投入時間,如果沒有辦法使用YACC直接定義。 因爲我發現JavaCC,Jacc,CUP,ANTLR4和其他很多可能的選項之間有很多潛在的選擇,我想選擇一個儘可能接近yacc的選項以減少實施時間。 任何幫助,將不勝感激。

回答

0

野牛(以下簡稱 「YACC兼容」 解析器生成最常被誤稱爲 「YACC」)can generate Java parsers。話雖如此,我從來沒有嘗試過,所以我不知道你會遇到什麼問題。

「yacc」語法包括目標語言中的語義規則;如果您有現有語法,則語義規則可能會用C語言編寫.Yacc語法也取決於掃描程序的存在,通常使用flex(或用於Java的JFlex,其工作方式非常類似)創建。

爲了使用基於Java的解決方案,即使是使用相同語法語法的解決方案,也需要重寫現有yacc語法中的所有語義操作,並重寫隨附的掃描程序。 BYacc/J也是如此;你不能只提供一個C語言目標的yacc語法文件給解析器生成器,並希望得到一個正常運行的Java解析器。

所以你肯定需要了解yacc/bison/flex是如何工作的。

注:野牛(和朋友)的目的是解析語法正確的程序。顯然,他們可以檢測到語法錯誤,但從語法錯誤中恢復以繼續解析是非常棘手的;對於語法突出顯示,如果可能的話,您肯定希望能夠檢測到多個錯誤。所以你可能會發現你現有的yacc語法只是一個開始。