1

解析しようとしているマークアップ言語について、ANTLR でパーサー生成を試してみることにしました。私はこの分野に不慣れで、何かを台無しにしています。

私の文法は

grammar Test;
DIGIT   :   ('0'..'9');
LETTER  :   ('A'..'Z');
SLASH   :   '/'; 
restriction
    :   ('E' ap)
    |   ('L' ap)
    |   'N';
ap  :   LETTER LETTER LETTER;
car :   LETTER LETTER;
fnum    :   DIGIT DIGIT DIGIT DIGIT? LETTER?;
flt :   car fnum?;
message :   'A' (SLASH flt)? (SLASH restriction)?;

入力文字列を与えると、まさに私が望むことを行いますA/KK543/EPOS。しかし、与えるとA/KL543/EPOS失敗します(MismatchedTokenException(9!=5))。ある種の対立のようです。最初の L で生成したいrestrictionので、言語定義で何か間違っているように見えますが、何を正しく見つけることができません。

4

1 に答える 1

3

入力"A/KK543/EPOS"に対して、次のトークンが作成されます。

'A''A'
スラッシュ'/'
文字「K」
文字「K」
DIGIT '5'
DIGIT '4'
DIGIT '3'
スラッシュ'/'
'E''E'
手紙「P」
文字'O'
文字'S'

ただし、入力"A/KL543/EPOS"の場合、これらが作成されます。

'A''A'
スラッシュ'/'
文字「K」
'L''L'
DIGIT '5'
DIGIT '4'
DIGIT '3'
スラッシュ'/'
'E''E'
手紙「P」
文字'O'
文字'S'

ご覧のとおり、charはトークン化され'L'ませLETTER。リテラルトークン、、、'A'およびパーサールール内の'E'場合、ANTLRは(自動的に)他のすべてのレクサールールの前に配置される個別のレクサールールを作成します。これにより、レクサーは舞台裏で次のようになります。'L''N'

A      : 'A';
E      : 'E';
L      : 'L';
N      : 'N';
DIGIT  : '0'..'9';
LETTER : 'A'..'Z';
SLASH  : '/'; 

そのため、単一'A''E'、、、'L'およびがトークン'N'になることはありません。LETTERこれは単にANTLRがどのように機能するかです。それらを文字として一致させたい場合は、パーサールールを作成し、これらのトークンにも一致letterさせる必要があります。このようなもの:

message
 : A (SLASH flt)? (SLASH restriction)?
 ;

flt
 : car fnum?
 ;

fnum
 : DIGIT DIGIT DIGIT DIGIT? letter?
 ;

restriction
 : E ap
 | L ap
 | N
 ;

ap
 : letter letter letter
 ;

car
 : letter letter
 ;

letter
 : A
 | E
 | L
 | N
 | LETTER
 ;

A      : 'A';
E      : 'E';
L      : 'L';
N      : 'N';
DIGIT  : '0'..'9';
LETTER : 'A'..'Z';
SLASH  : '/'; 

これは次のように入力を解析します"A/KL543/EPOS"

ここに画像の説明を入力してください

于 2012-11-29T19:43:09.773 に答える