请考虑这个非常简化的示例,其中应该匹配以下形式的输入
mykey -> This is the value
grammar Root;
parse
: ID '->' value
;
value
: Word+
;
ID
: ('a'..'z')+
;
Word
: ('a'..'z' | 'A'..'Z' | '0'..'9')+
;
WS
: ' ' -> skip
;
如果您需要一个简单的实际应用程序,那么您可以考虑Java中的字符串。其中一些可能是需要用完全不同的解析器解析的regex。它类似于您可以在IDEA内部使用的注入语言。
问:在ANTRL4中是否有一种惯用的方法来用不同的语法解析特定的规则?最好的情况是,我可以在语法级别上指定它,以便生成的AST是包含注入语言的子树的外部语言的组合。
实际上,使用模式是惯用的解决方案。只需要在识别模式保护时有点创造性:
parser grammar RootParser ;
options {
tokenVocab = RootLexer ;
}
parse : ID RARROW value EOF ;
value : WORD+ ;
和
lexer grammar RootLexer ;
ID : [a-z]+ ;
RARROW : '->' -> pushMode(value) ;
mode value ;
EOL : [\r\n]+ -> popMode, skip ;
WORD : [a-zA-Z0-9]+ ;
WS : ' ' -> skip ;
可能在内部使用的代码将在规则之后被取消,如下所示: ANTLR4就是这样做事的吗?
我对是否允许以下情况感到困惑: UPDATE:我知道当我在for循环中提供正确的声明类型时,它就会工作。问题是如果我不这样做会发生什么?
如果没有引用,会导致解析发生更改吗?
我正在使用antlr4 c语法作为我自己语法的灵感。我来了一件事,我真的不明白。为什么没有使用数据类型时会有Lexer规则?例如,规则从未使用过,但分析器规则(为了简化已删除其他数据类型)使用了好几个地方。解析器规则typeSpecifier没有使用lexer规则double有什么原因吗?
谢谢回复! 皮特
这是我的语法文件的一部分: 段落规则应该“标记”我岛语法中的所有段落,因为我想围绕生成的段落元素生成p块。从技术上讲,所有不同的段落元素都可以识别。 问题是,不同的规则会导致侦听器中的段落调用不同。由于规则不同,这是完全合乎逻辑的,但这使得在侦听器中处理树非常困难。同一段落的两个不同条目(例如)可以在图1中找到。 输入文本为: 只有一个段落,但如果我处理树,输出的HTML将包含两个段落。 有没有办