Я знаком с тем, что грамматики C и С++ являются контекстно-зависимыми, и, в частности, вам нужен "lexer hack" в C. On с другой стороны, у меня создалось впечатление, что вы можете анализировать Java с помощью всего 2 токенов, несмотря на значительное сходство между двумя языками.
Что бы вы изменили в отношении C, чтобы сделать его более удобным для анализа?
Я спрашиваю, потому что все примеры, которые я видел в C-чувствительности, технически допустимы, но ужасно странные. Например,
foo (a);
может вызвать функцию void foo
с аргументом a
. Или он мог бы объявить a
объектом типа foo
, но вы могли бы так же легко избавиться от скобок. В частности, эта странность возникает из-за того, что правило производства "прямого декларатора" для грамматики C выполняет двойную цель объявления обеих функций и переменных.
С другой стороны, Java-грамматика имеет отдельные правила производства для объявления переменных и объявления функций. Если вы пишете
foo a;
то вы знаете, что объявление переменной и foo
можно однозначно анализировать как имя_файла. Это может быть недействительным кодом, если класс foo
не был определен где-то в текущей области, но это задание для семантического анализа, которое может быть выполнено в последнем компиляторе.
Я видел, что он сказал, что C трудно разобрать из-за typedef, но вы также можете объявить свои собственные типы на Java. Какие правила грамматики C, кроме direct_declarator
, виноваты?