ANTLR4:上下文相关空间?
ANTLR4: context-sensitive spaces?
在语法中,我想实现没有字符串定界的文本 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 词法分析器规则,space
in "somethingelse ;" 被忽略(通过 lexer-rule WS),因此解析器规则
stat :因此正确检测到其他内容。
但是由于删除了 SPACE-rule,内容文本将减少为单个 in-between-spaces,
所以 "this here" 将减少到 "this here".
这不是什么大问题,但仍然是一个问题
有趣的问题:
是否可以实现上下文相关的 WS 或 SPACE
词法分析器规则:
在内容解析器规则中任何 space 都应该被保留,
在任何其他规则中 spaces 应该被忽略。
是否可以在 ANTLR4 中定义这种上下文相关的词法分析器规则行为?
由于 SPACE
规则在 WS
规则之前,词法分析器向解析器返回一个 space 标记。 “ ”未放置在隐藏频道上。
你考虑过Lexer Modes吗? mode()、pushMode()、popMode 部分对您来说可能很有趣。
但我认为词法分析器模式更多的是问题而不是解决方案。它们的目的是在词法分析器中使用(解析器)上下文。因此,人们应该放弃分离词法分析器和解析器的范例 - 而是使用 PEG 解析器。
在语法中,我想实现没有字符串定界的文本 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 词法分析器规则,space in "somethingelse ;" 被忽略(通过 lexer-rule WS),因此解析器规则 stat :因此正确检测到其他内容。 但是由于删除了 SPACE-rule,内容文本将减少为单个 in-between-spaces, 所以 "this here" 将减少到 "this here".
这不是什么大问题,但仍然是一个问题 有趣的问题:
是否可以实现上下文相关的 WS 或 SPACE 词法分析器规则:
在内容解析器规则中任何 space 都应该被保留, 在任何其他规则中 spaces 应该被忽略。
是否可以在 ANTLR4 中定义这种上下文相关的词法分析器规则行为?
由于 SPACE
规则在 WS
规则之前,词法分析器向解析器返回一个 space 标记。 “ ”未放置在隐藏频道上。
你考虑过Lexer Modes吗? mode()、pushMode()、popMode 部分对您来说可能很有趣。
但我认为词法分析器模式更多的是问题而不是解决方案。它们的目的是在词法分析器中使用(解析器)上下文。因此,人们应该放弃分离词法分析器和解析器的范例 - 而是使用 PEG 解析器。