当前位置: 首页 > 知识库问答 >
问题:

antlr4支持自适应语法吗?

岳嘉石
2023-03-14

antl4是否支持允许用户指定新规则的自适应语法,例如强制函数声明中指定的参数数量?

示例:基本语言包括以下标记定义:

  • 令牌#1定义为[a-z][0-9]*

大写为函数名保留,小写为传递给函数的变量保留。

用户可以“声明”Fxy,下面的每个F实例都必须有两个变量。我希望解析器执行“新规则”。

也许这是编译器中的标准公平,我知道我在C、python等中使用的编译器。当我没有为我在别处声明的函数传递正确数量的参数时。然而,我不知道如何在我自己的语法中做到这一点;我上的编译器本科课程是15年前的事了,我不记得它包括如何强制执行用户声明函数所需的参数。我写过一些简单的语言,有五个关键字和范围(括号),有点类似于教科书中的计算器示例,但并不复杂。

所以,我想我也想知道的是ANTLR的书是否会教我如何做到这一点(如果书没有解释我想实现什么,我不想花钱)。

共有2个答案

解修然
2023-03-14

自适应语法本质上是“自扩展”解析器的语法,它从输入中“学习”新的语法规则。ANTLR似乎不支持自适应语法,但是有一些其他的解析器生成器支持它们,例如dypgen,它基于GLR解析算法。

澹台华晖
2023-03-14

自适应语法就是生成另一种语法的语法。但这并不是您真正想要的,也不是解析器通常用于您描述的目的的方式。

一般来说,语法定义了语言(或DSL)的允许语法,而从语法生成的树的访问者确定是否满足语言语义学。对命名函数的调用是否包含正确数量和类型的参数是一个语义学问题,而不是语法问题。

考虑下面的语法片段:

decl   : fName AS FUNC LPAREN params? RPAREN body ;
func   : FUNC fName LPAREN params? RPAREN body ;
params : param ( COMMA param)* ;
param  : type pname ;

stmnt  : fname LPAREN ( pname ( COMMA pname )* )? RPAREN SEMI ;

它允许标准函数(方法)和声明新函数。stmnt规则允许调用命名函数。

pnames的类型和数量是否正确是一个语义问题,只能通过遍历生成的树进行分析才能回答:是否有一个函数具有给定的fname、pnames和params的数量是否匹配、类型是否匹配或是否可转换,等等。

Antlr的书籍会有所帮助。您可能希望花一些时间查看存储库语法,以便更好地了解语法如何描述不同的语言。

 类似资料:
  • 我正在运行ANTLR4.2,并使用规范的C文法: https://github.com/ANTLR/grammars-v4/tree/master/C 我正在执行以下步骤:(使用ANTLR4书中的批处理文件) ANTLR C.G4 javac c*.java grun C compilationUnit-tokens test.C 其中test.c有以下代码: 传球: 失败:错误是:第3行:9在输

  • 我有一个利用CharsAsTokens人造lexer的无扫描解析器语法,它为ANTLR4到4.6版本生成了一个可用的Java解析器类。但是,当更新到ANTLR 4.7.2到4.9.3-Snapshot时,该工具会生成代码,从相同的语法文件产生数十个编译错误,如下所述。 我这里的问题很简单:是否不再支持无扫描解析器语法,或者必须在4.7和更高版本中以不同的方式指定基于字符的终端? 更新: 不幸的是,

  • 我在ANTLR4中有以下语法 一切都很好.我在语法1中哪里错了?

  • 好吧,冒着被嘲笑没有“更努力”的风险,我有一个场景,我一直在尝试适应一个pythonic switch案例陈述。我知道python在3.10中有新的方法,但在我的AWS用例中我仅限于3.8.10。我一直在阅读其他语言中的switch case,我想找到一种pythonic方法,将下面混乱的语句转换为干净的switch case。我想知道在这种情况下其他人会怎么做 目标:我有一个文件名,该文件名将被

  • 现支持语言:中文简体,中文繁体,英文。 在安装服务器端程序时,会有选项,可以根据自己的需要,选择语言。