Antlr跳过标签外的文本

时间:2018-04-09 13:13:49

标签: antlr antlr4

我试图跳过/忽略自定义标签之外的文字:

  

此文字是要跳过的唯一标记< ?compo \ 5 + 5 \?>这个< ?compo \ 1 + 1 \?>

我尝试了跟随词法分析器:

TAG_OPEN    : '<?compo '    -> pushMode(COMPOSER);

mode COMPOSER;

TAG_CLOSE   : ' ?>'         -> popMode;

NUMBER_DIGIT    : '1'..'9';
ZERO            : '0';

LOGICOP
        : OR
        | AND
        ;

COMPAREOP
        : EQ
        | NE
        | GT
        | GE
        | LT
        | LE
        ;

    WS          : ' ';
    NEWLINE     : ('\r\n'|'\n'|'\r');
    TAB         : ('\t');

...

和解析器:

instructions
        : (TAG_OPEN statement TAG_CLOSE)+?;

statement
        : if_statement
        | else
        | else_if
        | if_end
        | operation_statement
        | mnemonic
        | comment
        | transparent;

但它不起作用(我通过使用规则“说明”上的intelliJ测试器测试它)...

我还在“COMPOSER”模式之外添加了一些跳过规则:

TEXT_SKIP : TAG_CLOSE .*? (TAG_OPEN | EOF)  -> skip;

但我没有任何结果......

有人可以帮助我吗?

编辑:

我更改了“指令”,现在为每个标记的每条指令正确构建了解析器树:

instructions : (.*? TAG_OPEN statement TAG_CLOSE .*?)+;

但我在标签外面有一个无法识别的字符错误

2 个答案:

答案 0 :(得分:0)

以下是一个适合我的快速演示。

Lexer语法:

lexer grammar CompModeLexer;

TAG_OPEN
 : '<?compo' -> pushMode(COMPOSER)
 ;

OTHER
 : . -> skip
 ;

mode COMPOSER;

  TAG_CLOSE
   : '?>' -> popMode
   ;

  OPAR
   : '('
   ;

  CPAR
   : ')'
   ;

  INT
   : '0'
   | [1-9] [0-9]*
   ;

  LOGICOP
   : 'AND'
   | 'OR'
   ;

  COMPAREOP
   : [<>!] '='
   | [<>=]
   ;

  MULTOP
   : [*/%]
   ;

  ADDOP
   : [+-]
   ;

  SPACE
   : [ \t\r\n\f] -> skip
   ;

解析器语法:

parser grammar CompModeParser;

options {
  tokenVocab=CompModeLexer;
}

parse
 : tag* EOF
 ;

tag
 : TAG_OPEN statement TAG_CLOSE
 ;

statement
 : expr
 ;

expr
 : '(' expr ')'
 | expr MULTOP expr
 | expr ADDOP expr
 | expr COMPAREOP expr
 | expr LOGICOP expr
 | INT
 ;

输入This text is a unique token to skip <?compo 5+5 ?> also this <?compo 1+1 ?>的测试产生了以下树:

enter image description here

答案 1 :(得分:0)

我找到了另一种解决方案(不像以前那样优雅):

  1. 在常规上下文中创建通用TEXT标记(因此在标记模式之外)

    TEXT : ( ~[<] | '<' ~[?])+ -> skip;
    
  2. 创建解析器规则以处理通用文本

    code
        : TEXT
        | (TEXT? instruction TEXT?)+;
    
  3. 创建解析器规则以处理指令

    instruction
        : TAG_OPEN statement TAG_CLOSE;