我想标记下一个单词"最小量子的单数执行"写在多行中。如果您在一行中有完整的单词,这很简单
foo bar foo bar foo bar SINGULAR EXECUTIVE OF MINIMUM QUANTIA foo bar foo bar foo bar foo bar
foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo barfoo bar foo bar foo bar
但是当我将单词分成两行时,我无法标记它
foo bar foo bar foo bar SINGULAR EXECUTIVE OF
MINIMUM QUANTIA foo bar foo bar foo bar foo bar
foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar
这是我的词法分析
SPECIALWORD:S I N G U L A R ' ' E X E C U T I V E ' ' O F ' ' M I N I M U M ' ' Q U A N T I A
fragment A:('a'|'A'|'á'|'Á');
......
......
fragment Z:('z'|'Z');
WORDUPPER: UCASE_LETTER UCASE_LETTER+;
WORDLOWER: LCASE_LETTER LCASE_LETTER+;
WORDCAPITALIZE: UCASE_LETTER LCASE_LETTER+;
LCASE_LETTER: 'a'..'z' | 'ñ' | 'á' | 'é' | 'í' | 'ó' | 'ú';
UCASE_LETTER: 'A'..'Z' | 'Ñ' | 'Á' | 'É' | 'Í' | 'Ó' | 'Ú';
INT: DIGIT+;
DIGIT: [0-9];
WS : [ trn]+ -> skip;
ERROR: . ;
我尝试在词法分析器规则中使用换行符
SPECIALWORD:S I N G U L A R ' ' E X E C U T I V E ' ' O F [n] M I N I M U M ' ' Q U A N T I A
但它不起作用,我猜是因为词法分析器逐行标记。
所以你真正想要的是允许 5 个单词的组合成为某个标记,同时允许它们之间有任意数量的空格。这实际上是基于 ANTLR4 的解析器的默认工作原理。您尝试将所有内容放入一个词法分析器令牌中会使事情变得复杂。
而是将您的(关键字(定义为:
SINGLUAR_SYMBOL: S I N G U L A R;
EXECUTIVE_SYBOL: E X E C U T I V E;
OF_SYMBOL: O F;
MINIMUM_SYMBOL: M I N I M U M;
QUANTIA_SYMBOL: Q U A N T I A;
and define a parser rule to parse these as a special sentence:
singularExec: SINGLUAR_SYMBOL EXECUTIVE_SYBOL OF_SYMBOL MINIMUM_SYMBOL QUANTIA_SYMBOL;
连同您的WS
规则,它将匹配单个符号之间的任何空格组合。
如果"OF"和"MINIMUM"之间只有一个n
并且没有其他字符,则修订后的规则匹配。但是,您的输入在换行符之前包含一个空格。因此,规则不匹配。
如果从输入中删除空格或调整规则以在换行符之前允许空格,则它将匹配。
您可能希望使用[ n]+
来允许任意数量的空格和/或换行符(您可能希望加入t
和r
以获得良好的度量(,或者如果您仍然希望将其限制为单个换行符,但允许在其周围使用任意数量的空格,则使用' '* 'n' ' '*
。
也就是说,如果您将每个单词作为自己的令牌,您可能会有更轻松的时间。