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

为什么这个语法不能解析这个输入?

司空奕
2023-03-14
function aFunctionHere(int a, function callback) ....

然而,Antlr似乎不喜欢我在两个不同的地方使用“函数”。据我所知,语法甚至没有歧义。

在下面的语法中,如果我删除第1行,生成的解析器解析示例输入没有问题。另外,如果我更改第2行或第3行中的令牌字符串,使它们不相等,解析器就会工作。

我得到的语法错误是:

grammar test;

begin : function ;

function: FUNCTION IDENTIFIER '(' parameterlist? ')' ;

parameterlist: parameter (',' parameter)+ ;

parameter: BaseParamType IDENTIFIER ;

// Lexer stuff

BaseParamType:
      INT_TYPE
    | FUNCTION_TYPE // <---- LINE 1
    ;

FUNCTION : 'function'; // <---- LINE 2

INT_TYPE : 'int';
FUNCTION_TYPE : 'function'; // <---- LINE 3

IDENTIFIER : [a-zA-Z_$]+[a-zA-Z_$0-9]*;

WS : [ \t\r\n]+ -> skip ;

测试生成的解析器的程序:

from antlr4 import *
from testLexer import testLexer as Lexer
from testParser import testParser as Parser
from antlr4.tree.Trees import Trees

def main(argv):
    input = FileStream(argv[1] if len(argv)>1 else "test.in")
    lexer =  Lexer(input)
    tokens = CommonTokenStream(lexer)
    parser = Parser(tokens)

    tree = parser.begin()

    print Trees.toStringTree(tree, None, parser)


if __name__ == '__main__':
    import sys
    main(sys.argv)

共有1个答案

刘选
2023-03-14

只需为令牌函数使用一个名称。

代币只是代币。孤立地查看函数,无法确定它是函数还是function_type。因为函数位于文件的第一位,所以lexer使用了这个函数。这使得无法匹配function_type,从而成为无效的令牌类型。

解析器将找出标记函数的语法角色。因此,即使有可能使用两个不同的词法描述符来表示相同的意思,也是没有意义的。

grammar test;  
begin : function ;
function: FUNCTION IDENTIFIER '(' parameterlist? ')' ;
parameterlist: parameter (',' parameter)+ ;
parameter: baseParamType IDENTIFIER ;

// Lexer stuff
baseParamType:
      INT_TYPE
    | FUNCTION //
    ;

FUNCTION : 'function';
INT_TYPE : 'int';
IDENTIFIER : [a-zA-Z_$]+[a-zA-Z_$0-9]*;
WS : [ \t\r\n]+ -> skip ;
 类似资料:
  • 编辑:当我使用ANTLRWorks以相同的语法输入时,会抛出一个NoViableAltException。我如何通过代码得到错误?

  • 预计此函数将无法typeCheck。然而,没有解释发生这种情况的原因。在GHCI中试用时,我得到了以下输出: 为什么会出现这种情况?

  • 奇怪的是,标记为“OK”的行编译得很好,但标记为“Error”的行失败了。它们看起来基本上是一样的。

  • 因此,作为学校的一部分,我正在使用For循环,我有一些代码可以工作,但我很难理解为什么它可以工作。对我来说,重要的是要真正理解为什么一块代码能做它不能做的事情,而不仅仅是它能工作。 所以有一点背景。这个小程序利用for循环,根据用户输入打印一系列字符。其思想是用户输入一个介于1和8之间的数字,程序将打印一个字符,然后移动到下一行再打印两个,移动到下一行再打印三个等等,并打印用户输入的行数。 程序在

  • 我目前正在修复别人的Java代码中的一个bug,但我无法解释这个bug。所讨论的代码是下面的if语句: 其中初始化为和函数如下所示: 令我困惑的是,即使被设置为false,代码仍然调用并执行函数。我一直认为这是不应该发生的短路。if语句本身总体上仍然被计算为false,因为只有第一个代码段中的else-block中的代码被执行。 那么,这个if语句为什么会有这样的行为呢?是短路失败,还是我误解了原

  • chrome浏览器 onclick链接 O:https://www.w3schools.com窗口打开 X:about:空白窗口打开