Coco/r: фактор удаляемый
Я пытаюсь реализовать язык в Coco/r для арифметических операций в C#, который принимает во внимание приоритет оператора. Мой код ATG выглядит так:
/* Coco/R lexer and parser specification for arithmetic expressions. */
/* 2006-09-14 */
/* Build with:
* Coco.exe -namespace Expressions Ex2.ATG
*/
using System.Collections.Generic;
COMPILER Expressions
public int res;
/*--------------------------------------------------------------------------*/
CHARACTERS
letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".
digit = "0123456789".
cr = '\r'.
lf = '\n'.
tab = '\t'.
TOKENS
ident = letter {letter | digit}.
number = digit {digit}.
IGNORE cr + lf + tab
PRODUCTIONS
/*------------------------------------------------------------------------*/
Expr<out int n> (. int n1, n2; .)
= Term<out n1> (. n = n1; .)
{
'+' Term<out n2> (. n = n+n2; .)
|
'-' Term<out n2> (. n = n-n2; .)
|
Factor<out int n>
}
.
Factor<out int n>
=
{
"==" Term<out n2> (. if(n1 == n2){ n = 1; } else { n = 2; } .)
|
'<' Term<out n2> (. if(n1 < n2) { n = 1; } else { n = 0; } .)
|
'>' Term<out n2> (. if(n1 > n2) { n = 1; } else { n = 0; } .)
|
"!=" Term<out n2> (. if(n1 != n2){ n = 1; } else { n = 0; } .)
|
"<=" Term<out n2> (. if(n1 <= n2){ n = 1; } else { n = 0; } .)
|
">=" Term<out n2> (. if(n1 >= n2){ n = 1; } else { n = 0; } .)
|
"|" Term<out n2> (. if(n1 != 0 | n2 != 0) { n = 1; } else { n = 0; } .)
|
"&" Term<out n2> (. if(n1 != 0 & n2 != 0){ n = 1; } else { n = 0; } .)
}
.
Term<out int n>
= number (. n = Convert.ToInt32(t.val); .)
{
'*' number (. n = n*Convert.ToInt32(t.val); .)
}
.
Expressions (. int n; .)
= Expr<out n> (. res = n; .)
.
END Expressions.
Операторы, отличные от "+" и "-", должны иметь более низкий приоритет. Более того, оператор "&" должен иметь более низкий приоритет, чем "|".
Проблема в том, что при попытке проверить код я получаю следующие ошибки:
Factor deletable
LL1 warning in Expr: contents of [...] or {...} must not be deletable
LL1 warning in Expr: "+" is start of several alternatives
LL1 warning in Expr: "-" is start of several alternatives
LL1 warning in Factor: "==" is start & successor of deletable structure
LL1 warning in Factor: "<" is start & successor of deletable structure
LL1 warning in Factor: ">" is start & successor of deletable structure
LL1 warning in Factor: "!=" is start & successor of deletable structure
LL1 warning in Factor: "<=" is start & successor of deletable structure
LL1 warning in Factor: ">=" is start & successor of deletable structure
LL1 warning in Factor: "|" is start & successor of deletable structure
LL1 warning in Factor: "&" is start & successor of deletable structure
Я действительно новичок в Coco/r и EBNF. Я заглянул в руководство Коко, но не понимаю, в чем проблема; Что мне не хватает?
Заранее спасибо!
1 ответ
Я думаю, что в Factor
, скорее, чем
Factor<out int n>
=
{
"==" Term<out n2> (. if(n1 == n2){ n = 1; } else { n = 2; } .)
|
...
}
Вы действительно хотите что-то вроде
Factor<out int n>
=
Term<out n1>
[
"==" Term<out n2> (. if(n1 == n2){ n = 1; } else { n = 2; } .)
|
...
]
То есть вы хотите безоговорочно требовать лидерства Term
, за которым затем необязательно может следовать ровно одно отношение. В противном случае вы бы позволили такие заявления, как a < b > c == d
,
Coco/R - это анализатор LL(1). Ошибки в основном говорят вам о том, что вы написали грамматику, которую нельзя исправить, заглянув на 1 символ вперед. Вам нужно либо реорганизовать грамматику, либо предоставить средства разрешения конфликтов. Я бы попытался провести рефакторинг грамматики, поскольку не думаю, что вам здесь нужны средства разрешения конфликтов. Для получения более подробной информации см. Руководство пользователя по "конфликтам".