2014-10-21 1 views
0

Я пытаюсь реализовать язык в Coco/r для арифметических операций в C#, который учитывает приоритет оператора. Мой код ATG выглядит так:Coco/r: Фактор, который можно удалить

/* 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 = "". 
    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/г и EBNF. Я просмотрел руководство Coco \ r, но я действительно не понимаю, в чем проблема; Что мне не хватает?

Спасибо заранее!

ответ

0

Я думаю, в 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.

 Смежные вопросы

  • Нет связанных вопросов^_^