2009-10-13 3 views
26

Я планирую написать компилятор C# 3.0 в C#. Где я могу получить грамматику для генерации парсера?Где я могу найти грамматику C# 3.0?

Предпочтительно тот, который работает с ANTLR v3 без изменений.

+6

Вы знаете, что мы уже поставляем бесплатно компилятор, который компилирует C# 3, правильно? :-) Но серьезно, почему вы строите свои собственные? Просто для удовольствия, или есть какая-то деловая цель? (Причина, о которой я прошу, заключается в том, что мы очень заинтересованы в том, чтобы узнать, что «услуги» хотят от нашего компилятора, а не просто «выплюнуть меня из IL для этого исходного кода».) –

+1

Eric: Прежде всего для удовольствия. Тем не менее, я время от времени придумываю какие-то языковые идеи, которые я бы хотел проверить. –

+0

@Mehrdad, если у вас есть какой-то код, я могу поиграть с ним :) –

ответ

7

Я столкнулся с ANTLR C# Grammar on CodePlex. Это относительно новый проект и использует ANTLR 3.2. В нем говорится, что он поддерживает C# 4.0 и лицензируется в рамках публичной лицензии Eclipse (EPL).

Я играл с ним немного. Он содержит кучу тестовых файлов, содержащих выражения. Он поддерживает lambdas, небезопасный контекст, ... как вы, естественно, ожидаете. Он анализирует файл C# и передает вам абстрактное синтаксическое дерево. Вы можете делать все, что хотите.

3

Вы ищете что-то наподобие this или this?

См. Также вопрос C# ANLTR grammar.

+1

Связанная грамматика не C# 3.0. Он не поддерживает лямбда. Это особенно важно для меня. –

+2

Казалось бы, добавление поддержки лямбда в терминах существующих конструкций в грамматике довольно тривиально, так как вам нужно только определить список аргументов.Однако это, вероятно, понадобится LL (*), поскольку вы можете анализировать что-то вроде '(a **' и не знаете, будет ли это в конечном итоге выражением типа '(a ** b)' (т.е. умножить 'a' на результат разыменования 'b') или лямбда-выражения' (a ** b) => ', пока вы не нажмете' => '. Так как нет ограничения на количество косвенности (указатель на указатель на .. .), похоже, что это для меня LL (*), но поскольку ANTLR3 поддерживает опцию LL (*), это не проблема. –

+0

@Pavel: Это не просто. Он не поддерживает дженерики. вероятно, напишу свой собственный парсер или грамматику с нуля, если я не смогу найти достаточно хорошую грамматику C# 3.0. –

3

Посмотрите на COCO/R кажется, что у них есть спецификация языка для C# 3.0.

12

Посмотрите на C# Language Specification. В главе B. Grammar вы найдете грамматику.

+0

Да, конечно, спецификация содержит грамматику. Однако грамматика в этом * документе Word * разбросана по всему документу и не подходит для генерации парсера. –

+8

Это не * только * разбросанное по всему, у нас есть приложение в конце всего этого в одном месте. Возможно, вы правы, что это d сделайте некоторые изменения, чтобы заставить его работать для генератора синтаксического анализатора. –

+1

Эрик: О, не заметил этого раздела. Спасибо за указание. –