проблем с дефиницията на функцията в моята граматика

Имам проблем с дефиницията на функцията в моята C граматика, която може да се намери тук http://www.archive-host.com/files/1959635/24fe084677d7655eb57ba66e1864081450017dd9/cAST.txt, не дефинира правилно и не мога да го умножа по нещо. Кодът, който се опитвам да въведа, е този:

int factorielle(int n)
  { int x;
   if ( n == 0)
  return 1;
   else return n*factorielle(n-1);
  }

Дефиницията на функцията е тази:

function_definition
    : declaration_specifiers declarator compound_statement
    | declarator compound_statement
    ;

declaration_specifiers трябва да бъде свързан към int и declarator към factorielle(int n), за да направя това, замених това:

direct_declarator
: ID ((direct_declarator '[' ']') | (direct_declarator '(' parameter_type_list ')') | (direct_declarator '(' identifier_list ')') | (direct_declarator '(' ')') )*

с

direct_declarator
: ID ((direct_declarator '[' ']') | (direct_declarator '(' parameter_type_list ')') | (direct_declarator '(' identifier_list ')') | (direct_declarator '(' ')')  | '(' parameter_type_list ')' )*

Но това не помага много.

Що се отнася до умножението, не знам как да го направя, без да предизвикам конфликт. има ли начин да се поправи това, моля?


person Exia0890    schedule 08.03.2013    source източник


Отговори (2)


Вероятно ще ви е трудно да анализирате реален C код, използвайки чиста граматика с чист ANTLR.

Причината е, че определени декларации изглеждат като легитимни изпълними изрази. (Въпреки че посоченият отговор изглежда е за LR(1) анализатори, всъщност става дума за анализатори, които не могат да се справят с неяснота; ANTLR не може).

Единственият начин да ги различите е да използвате контекстна информация, налична от по-ранни декларации на символи. Така че ще трябва да събирате типове символи, докато анализирате, и да проверявате тази информация в редукциите на граматичните правила, за да решите дали такива екземпляри са изрази или декларации. (Не знам как се прилага това в ANTLR, въпреки че вярвам, че е възможно).

person Ira Baxter    schedule 09.03.2013
comment
Разбирам какво имаш предвид, що се отнася до контекста, ще видя дали мога да го науча. Но кодът за въвеждане обикновено е прост, примерът, който използвах, трябва да бъде един от най-сложните, които ще бъдат въведени в граматиката. Но е вярно, че имам много проблеми с неяснотата. - person Exia0890; 09.03.2013
comment
Трудността при повечето програми (инструменти) е, че въвеждането обикновено е просто, но те всъщност трябва да се справят с най-сложния случай, за да бъдат полезни на практика. Ако нямате железен контрол върху това, което хората подават на инструмента ви, те ще му дадат най-грозното нещо на планетата и ще се оплакват, когато се повреди. Ако създавате играчка за образователни цели, можете да игнорирате всички неприятни усложнения, стига да разберете къде мамите. - person Ira Baxter; 09.03.2013
comment
Виждам, изглежда, че дори просто изявление може да бъде трудно за управление. Но не мисля, че имам познания с Antlr, за да имам железен контрол върху него, но ще опитам. - person Exia0890; 09.03.2013
comment
Със сигурност е възможно да се анализира реален C код с ANTLR 3. Написах граматика на ANTLR 2, която е на уебсайта на antlr. Можете да видите как да се справите с typedefs в него с помощта на семантични предикати и как да се справите с неяснотата на декларацията/функцията с помощта на синтактични предикати. antlr3.org/grammar/cgram - person monty0; 11.03.2013
comment
@monty0: Да, вярвам, че можете да го направите с ANTLR, но трябва да имате хака за проверка на контекста. Това имах предвид, че не може да се направи с чиста граматика. Проблемът на OP е с неговата реализация, а не с вашата :-{ - person Ira Baxter; 11.03.2013

Може да съм намерил решение на първата част от проблема чрез замяна

compound_statement
  : '{' '}'
  | '{' statement_list '}'
  ;

с

compound_statement
  : '{' '}'
  | '{' statement_list '}'
  | '{' external_declaration+ '}'
  ;

и добавяне на това към direct_declarator:

| ID '(' parameter_type_list ')'

Но не знам дали ще доведе до някакви конфликти.

person Exia0890    schedule 09.03.2013