ANTLR是否可以将语法嵌入其中?

ANTLR是否可以将语法嵌入其中?,antlr,grammar,Antlr,Grammar,ANTLR:有没有可能在内置词法器的情况下使用嵌入语法来生成语法 例如,在我的语言中,我能够使用嵌入式SQL语言: var Query = [select * from table]; with Query do something ....; 使用ANTLR可能吗?是的,使用ANTLR它被称为孤岛语法。 您可以在island grammar文件夹中获得一个工作示例:它显示了语法在java代码中解析javadoc注释的用法 你也可以在文件里找到一些线索 有没有可能使语法与嵌入语法与它自己的词法

ANTLR:有没有可能在内置词法器的情况下使用嵌入语法来生成语法

例如,在我的语言中,我能够使用嵌入式SQL语言:

var Query = [select * from table];
with Query do something ....;

使用ANTLR可能吗?

是的,使用ANTLR它被称为孤岛语法。 您可以在island grammar文件夹中获得一个工作示例:它显示了语法在java代码中解析javadoc注释的用法

你也可以在文件里找到一些线索

有没有可能使语法与嵌入语法与它自己的词法在里面

如果你的意思是,是否可以使用单独的词法在一个语法中定义两种语言,那么答案是:不,那是不可能的

然而,如果问题是是否有可能将两种语言解析为一个AST,那么答案是:是的,这是可能的

您只需:

用各自的语法定义两种语言; 在主语法中创建一个lexer规则,该规则捕获嵌入语言的整个输入; 使用重写规则调用自定义方法,该方法解析外部AST并使用{…}将其插入主AST。请参阅主语法MyLanguage.g中的expr规则。 我的语言 语法和语言; 选择权{ 输出=AST; ASTLabelType=CommonTree; } 代币{ 根 } @成员{ 私有CommonTree parseSQLString sqlSrc{ 试一试{ MiniSQLLexer lexer=新的MiniSQLLexernew AntlStringStreamSqlSrc; MiniSQLParser=新的MiniSQLParsernew CommonTokenStreamlexer; 返回CommonTreeparser.parse.getTree; }卡奇{ 返回新的CommonTreenew CommonToken-1,e.getMessage; } } } 作语法分析 :分配+EOF->^ROOT分配+ ; 分配 :Var Id'='expr';'->^'='Id表达式 ; expr :Num |SQL->{parseSQL$SQL.text} ; Var:‘Var’; Id:'a'..'z'|'a'..'z'+; 数字:“0”…“9”+; SQL:'['~']'*']'; 空格:'{skip;}; MiniSQL.g 语法; 选择权{ 输出=AST; ASTLabelType=CommonTree; } 作语法分析 :“[”语句“]”EOF->语句 ; 陈述 :选择 ; 选择 :从ID中选择“*”->^从ID中选择“*” ; 选择:“选择”; From:'From'; ID:'a'..'z'|'a'..'z'+; 空格:'{skip;}; 主类 导入org.antlr.runtime.*; 导入org.antlr.runtime.tree.*; 导入org.antlr.stringtemplate.*; 公共班机{ 公共静态无效主字符串[]args引发异常{ 字符串src=var Query=[select*from table];var x=42;; MyLanguageLexer lexer=新的MyLanguageLexernew AntlStringStreamsrc; MyLanguageParser=新的MyLanguageParsernew CommonTokenStreamlexer; CommonTree-tree=CommonTreeparser.parse.getTree; DOTTREGENERATOR gen=新的DOTTREGENERATOR; StringTemplate st=gen.toDOTtree; System.out.printlnst; } } 运行演示 java-cp antlr-3.3.jar org.antlr.Tool MiniSQL.g java-cp antlr-3.3.jar org.antlr.Tool MyLanguage.g javac-cp antlr-3.3.jar*.java java-cp.:antlr-3.3.jar Main 根据输入:

var Query=[从表中选择*];var x=42; 主类的输出对应于以下AST:

如果希望在SQL中允许字符串文字(可能包含“]),以及注释(可能包含“和”),则可以在主语法中使用以下SQL规则:

SQL : '[' ~']' | '\ | '-' | '-' ~'-' |评论 |STR * ']' ; 片段STR :“\~'\\\\'”\r“\\'”\n“\'\'\+'\ | '\'\ ; 片段注释 :'-'~'\r'|'\n'* ; 这将在单个令牌中正确解析以下输入:

[ 选择a、b、c 从桌子上 其中a='AB]C' b=-一些]评论]这里是 ]
请注意,尝试为整个SQL方言或甚至是大型子集创建语法绝非易事!您可能希望搜索现有的SQL解析器,或者查看ANTLR wiki中的语法示例。

ANTLR似乎没有内置的解析嵌套语法的功能。在您的示例中,有两个技巧,包括语义谓词和编辑生成的解析器和词法分析器。看起来这里一切都不好。。。我认为在这种情况下,更正确的答案是否定的。AntLR没有内置的能力来做到这一点,但有时有两种技巧是有效的…@Astronavigator:对不起,我理解了你问题的第一行,因为用AntLR解析混合语言是可能的,这确实是可能的,而用非内置的相同语法描述混合语言是不可能的——至少在v3中是这样。正如您所注意到的,您需要定义一些起点和终点,以便让解析器知道在语言之间切换的位置。孤岛语法只是另一种常规语法,它通过输入流的选定部分调用。