0

我目前正在考慮在Java中實現顯示here的語言。演示文稿有點長,但它本質上是創建動態語音的DSL。 例子:使用ANTLR,JavaCC或JFlex優於StringTokenizer及其等價物有什麼優點/缺點?

rule ExampleRule 
{ 
    criteria Criterion1 Criterion2 Criterion3=value 
    response ExampleResponse 
    remember State:=1 
    trigger Object TriggerName 
    ApplyFacts "State1:1:0,State2:1:0" 
} 
response ExampleResponse 
{ 
    say "Text" then object ExampleRule 
    say "Text" then any ExampleRule 
    say "Text" 
    scene "Scenepath" 
} 

我已經看過了不同的解析器生成如ANTLR,JavaCC的和JFlex的,但我不知道是否只是使用的StringTokenizer /掃描儀和推出自己的解析器,因爲它是一個愛好項目。

我以前決定使用ANTLR,但在生成的源代碼中使用完整路徑名遇到了ANTLR的一些問題,運行時庫似乎有點重量級。我無法找到比較三個解析器庫或內置Java替代品的更多信息。

考慮到語言的性質,每個解析器的優缺點是什麼?

+0

這一切都取決於你的語言有多複雜。沒有細節(即語言的語法),這個問題就危險地接近「不具建設性」的領域,因爲它要求意見/討論。我建議你包含語言的語法或詳細說明。 –

+0

添加了對該語言描述的鏈接。 – fullwall

+0

TL; DR但您需要更大的解析器生成器:-) –

回答

2

使用的解析器生成器的優點在於:

  1. 正確性由施工。生成的解析器完全接受語法中指定的語言,並且對於各種類型的生成器有各種各樣的CS證明,從Knuth 1965開始。如果你自己推出,例如遞歸下降,你沒有直接的證明,也沒有簡單的方法來測試它。

  2. 開發時間。一旦你在發生器的弱點附近開始工作,解析器的建立速度可以和你輸入的一樣快。

'鑑於語言的性質'並非全部相關。主要從業人員在20世紀60年代實施比算術表達式更復雜的重大錯誤,這就是爲什麼我的觀點(1)是我的觀點(1)。

+0

您能否提供一些關於我要實施的語言的更多信息? – fullwall

+1

假設你先做兩次。 –

+0

@MarcovandeVoort不是。在20世紀90年代,我使用'yacc'作爲一系列用於定製語言的一次性處理器,我甚至沒有考慮RD或任何其他手動技術。如果我這樣做了,我懷疑他們中的任何一個都會完成。請注意,我並不是說這裏沒有缺點。在此之前,我花了數年的時間用COBOL的生產RD編譯器,我可能不想再這樣做。 – EJP

0

有四個types of languages需要適當的自動化(識別)機制。 StringTokenizer和Scanner適用於常規語言(最簡單),但對於上下文無關語言(例如編程語言,XML和其他包含嵌套結構的語言),則需要更高級的機制(例如下推自動機)。

沒有一個非常詳細的外觀,似乎你的情況下,你會更好的工具,如ANTLR。它們確實需要學習,但遠遠少於學習如何爲上下文無關的語言創建自己的詞法分析器和解析器。

-1

通常這取決於你問的人羣。

如果你跟編譯器保持編譯器,從遭受向後兼容性要求(與以前的版本或其他方言在一個統一的解析器(-options))的人,對解析速度的要求等你一般需要遞歸下降(大多數生產編譯器都是RD)。

如果你談論(也是專業的)編譯器人員例行生產定製爲另一個供應商的芯片的C或C++編譯器,論據更像是EJP的。當然,他們通常會採用他們已有的C(++)標準語法,並添加一些架構定製構造。

相關問題