簡単な言語の文法を定義したいと思います。
この言語では、ある種の割り当てが可能です。
例
keyworda: this is the 1 keyword-A
keywordb: this is the second keywordb
...
重要なのは、キーワードと':'
任意の文字の後に可能である必要があるということです(キーワードも)
私は多くのことを試しましたが、私はまだレクサーとパーサーの考え方にそれほど興味がないと思います...
私の最後のアイデアは失敗しました:
rule
: 'keyworda' ':' anychar* 'keywordb' ':' anychar* EOF
;
anychar
: .
;
NEWLINE
: ('\r'? '\n') {$channel=HIDDEN;}
;
編集
まず第一に:あなたの答えに感謝します!
マニュアルを読み、scottstanchfieldによるチュートリアルを見ました。
問題は、私が「anychar」のものを取得できないことです!
あなたは正しいです、私が急いでいたので、私が上で投稿した文法は間違っていました。
より良い試みはこれを先に行うことです。問題は、Tokenizerが定義alaのkeywordaなどを認識することです。
keyworda : this is keyworda.
keywordb : this is another key!
...
文法:
rule
: KEYA ':' STRING_LITERAL* NEWLINE
keybdefinition*
EOF
;
keybdefinition
: KEYB ':' STRING_LITERAL* NEWLINE
;
KEYA: 'keyworda';
KEYB:'keywordb';
STRING_LITERAL: 'a'..'z' | 'A'..'Z' | '0'..'9' | ':' | '.' | '&' | '/' | '\\' | ';';
NEWLINE: '\r'? | '\n';
SPACE: (' ' | '\t') {$channel=HIDDEN;};
編集II
なんてこった、あなたがそれを説明したようにそれをするのは静かに明白です。なぜ自分で手に入らなかったのかわからない!説明してくれたティムに感謝します!
残りの質問がもう1つあります。レクサーのトークンとパーサーの文法を定義する場合です。ツリーパーサーまたはパーサー自体のセマンティックをチェックする一般的な方法ですか?
たとえば、あなたが投稿したのと同じ文法が定義されているとしましょう。
keyworda : ab
keywordb : xy
keyworda : ab1
keywordb : xy1
...
ここで、keywordaを定義するたびに、keywordbが定義されているかどうかを確認したいと思います。後で、値が適切かどうかの意味を確認したいと思います。キーワードextends:'keyword value'があり、'keywordvalue'がすでに定義されているかどうかを確認する必要があると仮定します。
これは2つの方法で行うことができます。まず、パーサーの文法規則を変更し、そこにチェック用のJavaコードを追加します。次に、文法はそのままで、これらの条件をチェックするためにツリーパーサー文法を定義します。
どちらが良いのか、長所と短所は何なのか、私にはよくわかりません...
あなたの助けをどうもありがとう