3
[11:45:19] warning(200): mygrammar.g:14:57: Decision can match input such as "','" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input
[11:45:19] warning(200): C:\Users\Jarrod Roberson\mygrammar.g:14:57: Decision can match input such as "','" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input

我希望能够将函数嵌套在其他函数中。

myfunction(x) ->
  sqr(a) -> a * a,
  y -> sqr(x).

这是它抱怨的那条线

function : ID '(' args ')' '->' statement (',' statement)* ;

这就是它正在考虑的替代方案

statement : ATOM
          | expression
          | assignment
          | function
          ;

我正在使用.我的语句结束规则

program : (statement'.')*;

这是 ANTLRWorks 中的 synatx 图

语法图
(来源:vertigrated.com

我真的很喜欢在没有任何警告的情况下编译/工作。如何解决此警告情况?

4

1 回答 1

2

贾罗德·罗伯逊写道:

我真的很喜欢在没有任何警告的情况下编译/工作。如何解决此警告情况?

您的解析器可以解析以下输入:

f(x)-> g(y)-> y*y, x=y

在两个不同的解析树中:

在此处输入图像描述

和:

在此处输入图像描述

您可以通过强制解析器向前看来解决此问题,并确保',' statement在实际匹配这些规则之前先行。您可以通过使用(...)=>带有所述规则的句法谓词(部分)来做到这一点:

function
  :  ID '(' args ')' '->' statement ((',' statement)=> ',' statement)* 
  ;

function但是,如果您的规则具有某种您尚未定义的“结束”标记,则您不需要谓词。从您之前的问题和您的示例中:

myfunction(x) ->
  sqr(a) -> a * a,
  y = sqr(x).

看来您正在'.'使用function. 如果您将其添加到您的function规则中:

function
  :  ID '(' args ')' '->' statement (',' statement)* '.'
  ;

你根本不需要谓词。

于 2011-11-14T19:08:56.450 回答