1

非表示のチャネルに空白 (WS) があるとします。また、特定のルールだけで空白も考慮したいのですが、パーサーでその特定のルールだけで WS をデフォルト チャネルにすることは可能ですか?

4

3 に答える 3

0

パスに関する質問の答えを見てください。パーサールールに「\n」を入れた方法に注目してください。''も入れられるはずです。ここで、隠しチャネル上のWSのすべてのオプションを実行し、ルールに含める必要があることが唯一の懸念事項になります。

例えば

rulename : Token1 ' ' Token2 ' ' Token1 {place action here};

ルール名は小文字で始まり、パーサールールですが、「Token#」は大文字で始まり、レクサールールであることに注意してください。この例では、異なるトークンの間にルールにスペースが必要です。('' |'\ t'|'\ r'|'\ n')+のようなものを入れることができると思いますが、これは試していません。あなたが試みるためにそれを残してください。

于 2010-02-03T16:29:51.767 に答える
0

非表示のトークン ストリームはいつでも照会できます

つまり、C++ で

myrule: MYTOK { static_cast<antlr::CommonHiddenStreamToken*>(LT(1).get())->getHiddenAfter()->getType() == WS}? MYTOK 

セマンティック述語は、字句トークンに一致した後に空白トークンがあるかどうかを確認しますMYTOK

于 2010-02-03T20:03:44.090 に答える
0

レクサー規則は、文法ファイルにリストされている順序で評価されます。

これは、次のようなものを持つことができることを意味します。

STRING_LITERAL: '"' NONCONTROL_CHAR* '"';   


fragment NONCONTROL_CHAR: LETTER | DIGIT | UNDERSCORE |  SPACE | BACKSLASH | MINUS | COMMA;
fragment LETTER: LOWER | UPPER;
fragment LOWER: 'a'..'z';
fragment UPPER: 'A'..'Z';
fragment DIGIT: '0'..'9';
fragment SPACE: ' ' | '\t';
fragment UNDERSCORE: '_';   
fragment MINUS:  '-';
fragment BACKSLASH: '\\';

COMMA: ',';     

NEWLINE: ('\r'? '\n')+ { $channel = HIDDEN; };
TERMINATOR  : ';';


WHITESPACE: SPACE+ { $channel = HIDDEN; };

LINE_COMMENT
    :   
    '//' ~('\n'|'\r')*  ('\r\n' | '\r' | '\n') 
    {
        $channel = HIDDEN;
    }
    |   
    '//' ~('\n'|'\r')*     
    {
        $channel = HIDDEN;
    }
    ;   

ご覧のとおり、文字列リテラルにはスペースまたはタブを含めることができます。ただし、スタンドアロンのスペースまたはタブは HIDDEN チャネルに送信されます。

于 2010-02-03T21:03:25.227 に答える