2010-02-14 112 views
6

我工作的非程序員領域特定語言(DSL)。非程序員犯了很多語法錯誤:他們拼錯了關鍵字,他們不關閉括號,他們不終止塊等。提高ANTLR DSL解析錯誤消息

我正在使用ANTLR來生成我的解析器;它爲處理RecognitionExceptions提供了一個漂亮的機制來改進錯誤處理。但是我發現爲我的DSL開發出色的錯誤處理代碼非常困難。

在這一點上,我正在考慮簡化語言的方法,使我更容易爲用戶提供高質量的錯誤消息,但我不確定如何去解決這個問題。我覺得我要減少錯誤的模糊性莫名其妙,但我不知道如何實現在語法這一想法。

有什麼辦法,我可以簡化我的語言,提高解析錯誤消息爲我的用戶?

編輯:更新以澄清我對簡化語言的方法感興趣,而不僅僅是ANTLR錯誤處理提示。 (雖然,感謝那些!)

+0

你能給我們提供一些關於語法的更多信息嗎?你的DSL有什麼好處,它有什麼功能? – 2010-02-24 15:52:02

+0

http://www.choiceofgames.com/blog/choicescript-intro/我會馬上指出,它不是沒有上下文無關的... – 2010-02-25 00:49:53

+1

如果您的用戶犯了常見錯誤,您可以擁有語法令牌規則匹配常見錯誤,然後使這些規則輸出錯誤消息。 – 2010-02-25 11:18:44

回答

0

我最近讀了一篇關於爲他的解析器實現一個簡單的學習機制的人的文章。基本上,這個想法是標記ANTLR給出的錯誤的實際原因的分析錯誤。例如,

Error: No method "bar" for NilClass: foo

可以被標記爲:

Error: Tried to call "bar" on foo, but foo didn't have a value.

的想法實際上是從2003年紙傳來:Generating LR Syntax Error Messages from Examples。博客上的research!rsc也對此進行了討論。

+0

是否有任何機會http://research.swtch.com/2010/01/generating-good-syntax-errors.html剛剛出現在reddit上? – 2010-03-17 11:51:54

+0

是的,謝謝!那真是讓我煩惱。 – perimosocordiae 2010-03-17 15:48:08

1

與手卷語法相比,您可能會遇到使用解析器生成器時最困難的部分。

根據我的經驗,您要做的第一件事就是確保您準確地跟蹤行和列信息,以便您可以將用戶指向解析器認爲錯誤的確切位置。

這應該照顧用戶的90%的問題,即在行尾缺少逗號或分號。

這是另外的10%是在麻煩。

我通常從使用paraphrase關鍵字爲我的詞彙和語法標記提供有意義的名稱開始。

SEMI 
options {paraphrase="end of line terminator";} 
: ';' 
; 

ifExpr 
options {paraphrase="boolean expression";} 
    : expr 
; 

的Antlr將在它所生成任何錯誤消息使用這些短語。

看看這個頁面:http://www.antlr2.org/doc/err.html看看專家如何推薦你用Antlr 2做它,然後瀏覽這個頁面:http://www.antlr.org/blog/antlr3/error.handling.tml看到Antlr 3做出的改變。 (Antlr2頁面可能是最好的開始)。

0

好吧,我從來沒有用過ANTLR到目前爲止,只有JavaCC的。但既然你要實現一個DSL並關心可用性,你應該看看xtext。這是一個框架,

  • ,您可以指定文本語法在EBNF符號
  • 你的DSL生成一個解析器你
  • 生成語法高亮和語法錯誤的即時反饋作爲Eclipse插件
  • 編輯
  • ,您可以訪問底層的AST變換你的用戶創建成什麼

我通過參加演示文稿中的文字表述去年,一家專門研究DSL的德國公司去年。我很驚訝這個東西是多麼容易設置和工作。我用它來創建一個小遊戲的編輯器,它使用遊戲場的文本描述,然後解析並轉換成遊戲的對象模型。