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