如何忽略ANTLR4中的某些文本?

时间:2018-11-15 03:18:12

标签: java antlr antlr4

首先,感谢您的回答,这个问题使我丧命

  1. 我的第一个问题是如何忽略某些文本? 我想忽略文档中的某些文本,下一个文本是:

Text

我想忽略矩形包围的文本...当词法分析器找到“ demandante”单词时,它将停止忽略...

我用了这个语法

grammar A;

documento:((acciondemandante acciondemandado) | (acciondemandado acciondemandante));
acciondemandante: PALABRASDEMANDA informacionentidad+;
acciondemandado: PALABRASDEMANDADO informacionentidad+;
informacionentidad: nombres distancia? identificacion;
nombres: nombrenormal|nombremayuscula; 
nombrenormal: WORDCAPITALIZE WORDCAPITALIZE+;
nombremayuscula: WORDUPPER WORDUPPER+;
distancia: WORDLOWER;
identificacion: tipo indicador? INT+;
tipo: cedula | NIT;
cedula: CEDULA | LCASE_LETTER LCASE_LETTER | UCASE_LETTER UCASE_LETTER;
indicador: WORDCAPITALIZE | WORDLOWER;

CEDULA: 'cedula' | 'cc' | 'CC';
NIT: 'NIT' | 'nit';
PALABRASDEMANDADO: 'demandados' | 'demandado';
PALABRASDEMANDA: 'demandante' | 'demandantes';
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';  
SPECIAL_CHAR: '.'  -> skip;
WS : [ \t\r\n]+ -> skip;
//ANY: ~[ ]+;

我尝试过一种技巧,跳过空格 WS:[\ t \ r \ n] +->跳过; ,然后忽略不是空格的任何:〜[] +; 但这不起作用,因为词法分析器从不识别ANY令牌...

我希望我的语法阅读

废话废话 demandado朱利安·索拉特(c.c 120109321) 废话废话

  1. 我的第二个问题是遇到“输入不匹配”的问题,为了解决此问题,我添加了以下规则:“跳过:EOF->跳过;”但这不起作用...

非常感谢。

1 个答案:

答案 0 :(得分:1)

我对这个问题的解决方法是2个步骤:

  1. 在输入流中找到关键字(此处为 demandado )。
  2. 让解析器从该位置进行解析,而不必为语法中的输入强加EOF。在了解了什么之后,它将尽可能地忽略它不了解的所有内容。

这将使您的语法更加简单,并且仅针对相关输入将获得一个分析树。