Порядок работы для COCO/R в Visual Studio
В новый рабочий каталог разместить файлы Coco.exe, Scanner.frame и Parser.frame.
Создать файл CLN.ATG с описанием лексики и грамматики языка. (в данной работе грамматика простая - последовательность лексем) Например:
COMPILER CLN
CHARACTERS
letter = 'A'..'Z' + 'a'..'z'.
digit = "0123456789".
cr = '\r'. lf = '\n'. tab = '\t'.
TOKENS
Ident = letter {letter | digit}.
Number = digit {digit}.
COMMENTS FROM "//" TO lf
IGNORE cr + lf + tab
PRODUCTIONS
CLN = { Number | Ident }.
END CLN.
Для создания приложения с экранной формой предусмотреть текстовое поле, куда будут выводиться лексемы. В классе Parsera необходимо также разместить объект типа TextBox, в который перед запуском записать указатель на поле в форме. В прогрммае должны быть выполнены следующие операторы:
Scanner scanner = new Scanner("test.cln");
Parser parser = new Parser(scanner);
parser.tB = this.textBox1;
parser.Parse();
В грамматике делаются вставки, которые будут размещатся в сгенерированных программах. Одна для описания поля TextBox, две после определения каждой из двух лекскем. Последние заключаются в скобки (. .):
COMPILER CLN
public System.Windows.Forms.TextBox tB;
CHARACTERS
letter = 'A'..'Z' + 'a'..'z'.
digit = "0123456789".
cr = '\r'. lf = '\n'. tab = '\t'.
TOKENS
Ident = letter {letter | digit}.
Number = digit {digit}.
COMMENTS FROM "//" TO lf
IGNORE cr + lf + tab
PRODUCTIONS
CLN = { Ident (. tB.Text += "\r\n" + t.val; .)
| Number (. tB.Text += "\r\n" + t.val; .) }.
END CLN.
Поскольку Parser.cs и Scaner.cs создаются без указания пространства имен, в главной форме пространство имен также не нужно.
Запустить в командной строке Coco.exe CLN.ATG. В случае отсутствия ошибок в каталоге создадутся файлы Scanner.cs и Parser.cs. При нормальном завершении выдаются сообщения:
Coco/R (Sep 19, 2006)
checking
CLN deletable
parser + scanner generated
0 errors detected
Ошибки выглядят так:
Coco/R (Sep 19, 2006)
checking
CLN deletable
No production for Stat1
1 errors detected
В данном случае в грамматике не найдено правило для нетерминала Stat1.
Внесите в текст описания языка изменения и выясните, какие типы ошибок сообщает система.
Используйте при запуске COCO.exe режимы работы, которые задаются так: COCO.exe CLN.atg -trace ASF. В последоватльености сиволов буквы означают следующее:
A print the states of the scanner automaton
F print the first sets and follow sets of all nonterminals
G print the syntax graph of all productions
I trace the computation of first sets
J list the ANY and SYNC sets used in error recovery
P print statistics about the run of Coco/R
S print the symbol table and the list of declared literals
X print a cross reference list of all terminals and nonterminals
Для пакетного варианта приложения создайте файл CLN.cs с главной программой:
using System;
public class CLN
{
public static void Main(string[] arg)
{
Scanner scanner = new Scanner(arg[0]); // создать сканер
Parser parser = new Parser(scanner); // создать парсер
parser.Parse(); // запустить парсер
Console.WriteLine("Обнаружено ошибок: "+ parser.errors.count);
}
}
Оттранслируете главную программу, сканер и парсер:
csc.exe CLN.cs Scanner.cs и Parser.cs
Если траснялтор C# не доступен, создайте пакетный файл cs.bat для его вызова. Например:
C:\WINNT\Microsoft.NET\Framework\v2.0.50727\csc.exe %1 scanner.cs parser.cs
В таком случае он запускается cs.bat CLN.cs
В результате получится исполнимый файл синтаксического анализатора CLN.exe!
Напишите тестовую программу на языке CLN test.cln. Например:
ccc 111 333 sss
Выполните ее: CLN.exe test.cl При отсутствии ошибок выведется ссобщение "Обнаружено ошибок: 0" Внесите в текст программы ошибки и выясните, какие типы ошибок сообщает синтаксический анализатор.