我试图跳过/忽略自定义标签之外的文字:
此文字是要跳过的唯一标记< ?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 .*?)+;
但我在标签外面有一个无法识别的字符错误
答案 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 ?>
的测试产生了以下树:
答案 1 :(得分:0)
我找到了另一种解决方案(不像以前那样优雅):
在常规上下文中创建通用TEXT
标记(因此在标记模式之外)
TEXT : ( ~[<] | '<' ~[?])+ -> skip;
创建解析器规则以处理通用文本
code
: TEXT
| (TEXT? instruction TEXT?)+;
创建解析器规则以处理指令
instruction
: TAG_OPEN statement TAG_CLOSE;