如何在 ANTLR4 中标记多行中的单词
How to tokenize a word in multiple lines in ANTLR4
我想分词 "SINGULAR EXECUTIVE OF MINIMUM QUANTIA" 多行写的下一个词。如果你在一行中有完整的单词就很简单
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 : [ \t\r\n]+ -> 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
并且没有其他字符,则您修改后的规则匹配。但是,您的输入在换行符之前包含一个 space 。因此规则不匹配。
如果您从输入中删除 space 或调整您的规则以在换行符之前允许 spaces,它将匹配。
您可能希望使用 [ \n]+
来允许任意数量的 spaces and/or 换行符(您可能希望加入 \t
和\r
以及良好的衡量标准)或 ' '* '\n' ' '*
如果您仍想将其限制为单个换行符,但允许其周围有任意数量的 space。
也就是说,如果您让每个单词都有自己的标记,您可能会过得更轻松。
我想分词 "SINGULAR EXECUTIVE OF MINIMUM QUANTIA" 多行写的下一个词。如果你在一行中有完整的单词就很简单
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 : [ \t\r\n]+ -> 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
并且没有其他字符,则您修改后的规则匹配。但是,您的输入在换行符之前包含一个 space 。因此规则不匹配。
如果您从输入中删除 space 或调整您的规则以在换行符之前允许 spaces,它将匹配。
您可能希望使用 [ \n]+
来允许任意数量的 spaces and/or 换行符(您可能希望加入 \t
和\r
以及良好的衡量标准)或 ' '* '\n' ' '*
如果您仍想将其限制为单个换行符,但允许其周围有任意数量的 space。
也就是说,如果您让每个单词都有自己的标记,您可能会过得更轻松。