2017-11-20 3 views
0

ファイルの次の行を解析して、学生名と年齢を別々に識別したいと考えています。ANTLRの中間にスペースを含む文字列を扱う方法

Student Tim Jonh (25) 
Student Mack Woo (30) 

年齢は数字で、名前には空白が含まれている場合とそうでない場合があります。私は上記のANTLR文法の後に作成しました。

しかし、これは複数の単語として名前を解析します。しかし、私はそれを "Tim Jonh"や "Mack Woo"と同じように中央のスペースで取りたいと思っています。つまり、途中に2つのスペースがあれば、それをそのまま読むべきです。

​​

私は文法をどのように変更するべきかアドバイスしてください。

これは質問のために用意されたものであり、実際にはアプリケーションに複数の単語が読み込まれていると考えてください。

答えて

2
grammar school; 

students  : (student)*      ; 
student   : 'Student' studentname '(' age ')' ; 
studentname  : NAME        ; 
age    : INT        ; 
NAME   : WORD (WS WORD)*     ; 
fragment WORD : [a-zA-Z]+       ; 
INT    : [0-9]+       ; 

WS    : [ \t\r\n]+ -> skip    ; 
+0

代わりに 'studentname::WORD +;'を使用します。これは簡単で、任意の数の空白にも対応します。任意の2つの名前部​​分の間に2番目のスペース文字を追加すると、指定されたソリューションが失敗します。 –

+0

@MikeLischkeこれは学生名ごとに2つのトークンを生成します。それともOPが最初に投稿したものと違うでしょうか?また、 'WS'が' 1..n'の繰り返しとして定義されているので、第2のスペースはそれを壊さないでしょう。 –

+0

あなたは正しいです、そして、すべてが1つのトークンにとどまらなければならないかどうかは、OPの使用シナリオに依存します。スペースはほぼすべての言語区切りになっているので、それはまれです。 –

関連する問題