首页 > 解决方案 > 如何在 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

但它不起作用,我猜是因为词法分析器逐行标记。

标签: tokenantlrantlr4tokenize

解决方案


所以你真正想要的是允许 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规则一起,将匹配单个符号之间的任何空格组合。


推荐阅读