3

我正在尝试定义一个简单的函数式语言语法,我几乎完成了我的定义,但我无法克服以下歧义。

[14:43:53] warning(200): mygrammar.g:14:11: Decision can match input such as "ATOM" using multiple alternatives: 1, 2 As a result, alternative(s) 2 were disabled for that input 

[14:43:53] warning(200): mygrammar.g:14:11: Decision can match input such as "ID" using multiple alternatives: 1, 2 As a result, alternative(s) 2 were disabled for that input

以下是我认为的相关规则,ATOM 和 ID 的绘图几乎相同:

program : (statement'.')* ;

statement : assignment
          | expression;

assignment : func '->' statement ((','statement)=> ',' statement)*
           | ID '->' expression
           | ATOM '->' ( string | number ); 

func : (ID '(' args ')')=> ID '(' args ')'; 

term : func
     | '(' expression ')'  
     | number
     | string
     | ID
     | ATOM ;

ATOM : ('A'..'Z'|'_')+;

ID : ('a'..'z'|'_')('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;

这是来自 ANTLRWorks 的语法树

id 替代品 http://www.vertigrated.com/images/id_alternatives.png

这是我试图支持解析的粗略稻草人。

hypotenuse(a,b) -> 
  sqr(x) -> x * x,
  sqr(sqr(a) + sqr(b)). 

print(hypotnenuse(2,3)).

所以我需要能够支持statements嵌套functions

我的赋值运算符在哪里->,这是一种单一的赋值语言

.我的语句结束标记在哪里

这甚至可以用 ANTLR3 解析吗?

4

1 回答 1

2

一些使您的语法不那么模棱两可的提示:

  1. 删除'.'作为语句结束字符。例如,将其替换为 a ';'。两者都只是一个字符,并且 a和里面的 float';'不冲突;'.'
  2. 创建一个匹配浮点数的词法分析器规则;
  3. 一个函数后跟一个或多个语句,但没有明显的结尾(除了现在以 a 结尾的“main”函数'.')。你必须要么告诉你的解析器一个函数在哪里结束(不仅仅是“main”函数),或者必须引入一个规则来匹配一个“inner”函数,该函数没有多个尾随statements,而是一个expression;
  4. 你真的需要一个expression规则statement吗?两者都可以是一个函数(makein it,再次,模棱两可)。

这些只是您定义语言的方式中的一些问题。如果我是你,我不会继续这样下去:你可能会用谓词来修复一些东西,但在另一个地方改变一些东西会打开另一罐蠕虫。我建议你彻底重新设计你的语言。

如果您不想重新设计它,只需从语法中删除所有谓词并将以下行放在您的options {...}部分中:

backtrack=true;

这将(似乎)神奇地删除有关模糊规则的所有警告,但这不是推荐的修复方法。这样,ANTLR 会在遇到歧义时为您选择解析树,(高度)可能导致意外行为,并且对于大量输入,它会导致更长的解析时间。再说一次,这不是我想要的!有关全局回溯的更多信息,请参见 Wiki:http ://www.antlr.org/wiki/display/ANTLR3/How+to+remove+global+backtracking+from+your+grammar

于 2011-11-15T12:41:31.330 回答