こんにちは!
セミコロンやバックスラッシュを必要とせずに複数行の式を処理する単純な ANTLR 文法を作成するにはどうすればよいですか?
式の単純な DSL を作成しようとしています。
# sh style comments
ThisValue = 1
ThatValue = ThisValue * 2
ThisOtherValue = (1 + 2 + ThisValue * ThatValue)
YetAnotherValue = MAX(ThisOtherValue, ThatValue)
全体として、アプリケーションでスクリプトに名前付きの初期値をいくつか提供し、最終結果を引き出す必要があります。しかし、私は構文に夢中になっています。次のような複数行の式をサポートしたいと思います。
# Note: no backslashes required to continue expression, as we're in brackets
# Note: no semicolon required at end of expression, either
ThisValueWithAReallyLongName = (ThisOtherValueWithASimilarlyLongName
+AnotherValueWithAGratuitouslyLongName)
私は次のような ANTLR 文法から始めました。
exprlist
: ( assignment_statement | empty_line )* EOF!
;
assignment_statement
: assignment NL!?
;
empty_line
: NL;
assignment
: ID '=' expr
;
// ... and so on
それは簡単に思えますが、私はすでに改行に問題があります:
warning(200): StackOverflowQuestion.g:11:20: Decision can match input such as "NL" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input
グラフィカルに、org.antlr.works.IDE で:
意思決定は、複数の選択肢を使用して NL に一致させることができます http://img.skitch.com/20090723-ghpss46833si9f9ebk48x28b82.png
私は文法を蹴散らしましたが、常に期待される動作に違反してしまいます:
- ファイルの末尾に改行は必要ありません
- 空行は許容されます
- ポンド記号以降の行はすべてコメントとして破棄されます
- 代入はセミコロンではなく行末で終わる
- 括弧で囲まれている場合、式は複数の行にまたがることができます
これらの特徴の多くを備えた ANTLR 文法の例を見つけることができます。それらを切り詰めて表現力を必要なものだけに制限すると、何かが壊れてしまうことがわかりました。他は単純すぎて、表現力をつけながら壊していきます。
この文法でどの角度を取るべきですか? 自明または完全なチューリング完全言語ではない例を教えてください。