2016-09-22 64 views
0

在詞法分析器非貪婪規則,我有:ANTLR4與停止令牌

AT:       '@'       -> mode(OPERATOR); 
DOUBLE_AT:     '@@'      ; 
CURLY_CLOSE:    '}'       { block_nesting > 0 && block_nesting >= curly_nesting }? { curly_nesting--; block_nesting--; }; 
NORMAL_ELSE:    'else'      { previous_is_parenthesis_close() }? { block_nesting++; tokens.clear(); setType(ELSE); } -> mode(RYTHM); 
NWS:      [\t\r\n ]+     { setType(WS); }; 
CONTENT:     .+? ('@' | '}' | 'else' | '\t' | '\r' | '\n') ; 

的內容規則匹配所有,但其中包括終止它的令牌。這不是語法所需要的:它需要匹配所有,直到終止符,不包括。

有沒有辦法做我想要的?

回答

0

您可以嘗試使用下面的代碼:

CONTENT: ~('@' | '}' | 'e' | '\t' | '\r' | '\n')+; 
NOT_ELSE: 'e' -> type(CONTENT); 

但在這種情況下,你將有一個,而不是幾個CONTENT規則。您可以在解析器規則級別解決此問題。

+0

這只是移動問題。這也使得解析器需要處理更多的數據,然後當CONTENT只是一堆組合字符。 我沒有在使用TokenStreamRewriter的過程中,但這幾乎沒有記錄。並不像我預期的那樣工作。 –

0

現在,我創建了一個方法,將centain標記合併到一箇中,並使用反射將新列表提供給解析器。不完全漂亮,但它現在工作。