1

典型的なパーサジェネレータの状況(ANTLRやビーバーなど)では、次の状況をどのように処理できますか?

0051A2B3C4D5E
0031G2T3H

これは、3文字の数値フィールドであり、繰り返しフィールドの後に何回繰り返されるかを示します。

後処理の可能性があることは知っていますが、場合によっては役に立たないことがあるので、パーサーがそれを処理する方法があるかどうかを調べようとしています。数値フィールドを読み取るときにパーサーと対話することを含むソリューションがあれば許容されます。つまり、特定のプロダクションに基づいて次のN個のアイテムを読み取るように指示します。

4

1 に答える 1

2

これが可能かどうかは、パーサジェネレータによって異なります。

レクサーはその周囲を認識する必要があります(コンテキスト依存)。Num行の先頭にのみトークンを作成する必要があります。ANTLRでは、ルールgetCharPositionInLine()==0の前に述語を追加することでこれを行うことができます。Num

そして、パーサールールでは、カウンターがゼロより大きい(カウンターがの値である)限り、トークン(ダブル文字)をline消費し続ける必要があります。BlockNum

簡単なANTLRデモ:

grammar T;  

parse
 : line* EOF 
 ;

line
@init{int n = 0;}
 : Num {n = Integer.valueOf($Num.text);} ({n > 0}?=> Block {n--;})*
 ;

Num
 : {getCharPositionInLine()==0}?=> Digit Digit Digit
 ;

Block
 : AlphaNum AlphaNum
 ;

Space
 : (' ' | '\t' | '\r' | '\n')+ {skip();}
 ;

fragment Digit : '0'..'9';
fragment Letter : 'a'..'z' | 'A'..'Z';
fragment AlphaNum : Letter | Digit;

入力を解析します:

0051A2B3C4D5E
0031G2T3H

次のように:

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

于 2012-04-19T19:34:57.787 に答える