在语法中,我想实现没有字符串分隔xxx
的文本。
这个想法是定义像
a = xxx;
而不是
a ="xxx";
简化打字。否则应该有变量定义 和其他类型的东西。
作为第一种方法,我尝试了这种语法:
grammar SpaceNoSpace;
prog: stat+;
stat:
'somethingelse' ';'
| typed description* content
;
typed:
'something' '-'
| 'anotherthing' '-'
;
description:
'someSortOfDetails' COLON ID HASH
| 'otherSortOfDetails' COLON ID HASH
;
content:
contenttext ';'
;
contenttext:
(~';')*
;
COLON: ':' ;
HASH: '#';
SEMI: ';';
SPACE: ' ';
ID: [a-zA-Z][a-zA-z0-9]+;
WS : [ \t\n\r]+ -> channel(HIDDEN);
ANY_CHAR : . ;
这适用于这样的输入文件:
something-someSortOfDetails: aVariableName#
this is the content of this;
anotherthing-someSortOfDetails: aVariableName#
here spaces are accepted as much as you like;
somethingelse;
但是将最后一行修改为
somethingelse ;
导致语法错误:
line 7:15 extraneous input ' ' expecting ';'
这可能揭示了词法分析器
WS : [ \t\n\r]+ -> channel(HIDDEN);
未应用,(但是SPACE规则???)。
否则,如果我删除了SPACE lexer-rule,则为空格 在“somethingelse;”被忽略(由lexer-rule WS),以便解析器规则 stat:somethingelse因此被正确检测到。 但是由于删除了SPACE规则,内容文本将缩减为单个中间空格, 所以“这里”将被简化为“这里”。
这不是一个大问题,但它仍然是一个问题 有趣的问题:
是否可以实现上下文相关的WS或SPACE 词法规则:
在内容解析器规则中应该保留任何空间, 在任何其他规则空间应该被忽略。
这是否可以在ANTLR4中定义这样一个上下文相关的词法分析器规则行为?
答案 0 :(得分:1)
您考虑过Lexer Modes了吗?带有 mode(),pushMode(),popMode 的部分可能对您有用。
然而,我认为词法分析模式比解决方案更具问题。他们的目的是在词法分析器中使用(解析器)上下文。因此,人们应该放弃分离词法分析器和解析器的范例 - 而是使用PEG-Parser。
答案 1 :(得分:0)
由于SPACE
规则在WS
规则之前,因此词法分析器会将空格标记返回给解析器。 “不会被放置在隐藏的频道上。