Что является примером лексической ошибки и возможно ли, что в языке нет лексических ошибок? - PullRequest
9 голосов
/ 14 августа 2010

для нашего класса теории компилятора, перед нами стоит задача создания простого интерпретатора для нашего собственного языка программирования.Я использую jflex и cup в качестве моих генераторов, но я немного застрял в том, что такое лексическая ошибка.Кроме того, рекомендуется ли использовать функцию состояния jflex?это кажется неправильным, поскольку кажется, что синтаксический анализатор лучше подходит для обработки этого аспекта.и вы рекомендуете какие-либо другие инструменты для создания языка.Извините, если я нетерпелив, но это должно произойти во вторник.

Ответы [ 4 ]

14 голосов
/ 15 августа 2010

Лексическая ошибка - это любой ввод, который может быть отклонен лексером.Обычно это происходит из-за того, что распознавание токенов не соответствует определенным вами правилам.Например (без определенного синтаксиса):

[0-9]+   ===> NUMBER token
[a-zA-Z] ===> LETTERS token
anything else ===> error!

Если вы рассматриваете лексер как конечный автомат, который принимает допустимые входные строки, то ошибками будут любые входные строки, которые не приводятконечный автомат достигает принимающего состояния.

Остальная часть вашего вопроса была мне довольно непонятна.Если у вас уже есть некоторые инструменты, которые вы используете, то, возможно, вам лучше узнать, как добиться того, чего вы хотите достичь с помощью этих инструментов (у меня нет опыта работы с любым из упомянутых вами инструментов).Перечитав ваш вопрос, я могу ответить на вторую часть.Вполне возможно, что в языке не может быть лексических ошибок - это язык, на котором любая входная строка вообще является допустимым вводом.

3 голосов
/ 07 октября 2010

Лексическая ошибка может быть недопустимым или недопустимым символом для языка, например '@', который отклоняется как лексическая ошибка для идентификаторов в Java (зарезервировано).

Лексические ошибки - это ошибки, выдаваемые вашим лексером при невозможности продолжения. Это означает, что нет никакого способа распознать лексему как действительный токен для вашего лексера. Синтаксические ошибки, с другой стороны, будут выдаваться вашим сканером, когда заданный набор уже распознанных действительных токенов не соответствует ни одной из правых сторон ваших правил грамматики.

он чувствует себя не так, как кажется, парсер лучше подходит для обработки этот аспект

Нет. Это кажется , потому что контекстно-свободные языки включают обычные языки (то есть, чем анализатор может выполнять работу лексера). Но учтите, что синтаксический анализатор является автоматом стека, и вы будете использовать дополнительные ресурсы компьютера (стек) для распознавания чего-то, что не требует распознавания стека (регулярное выражение). Это было бы неоптимальным решением.

ПРИМЕЧАНИЕ: под регулярным выражением я подразумеваю ... регулярное выражение в смысле иерархии Хомского, а не класс java.util.regex.*.

2 голосов
/ 08 ноября 2013

Лексическая ошибка - это когда входные данные не принадлежат ни одному из этих списков: ключевые слова: "if", "else", "main"... символы: '=','+',';'... двойные символы: ">=", "<=", "!=", "++" переменные: [a-z/A-Z]+[0-9]*
номера: [0-9]*

примеры: 9var: ошибка, число перед символами, а не переменная и не ключевое слово. $: ошибка

что я не знаю, так это то, что принимается что-то вроде нескольких символов друг за другом, например "+ -"

0 голосов
/ 27 сентября 2014

Компилятор может поймать ошибку, если в нем есть грамматика!Это будет зависеть от самого компилятора, будет ли он иметь возможность (область) отлова лексических ошибок или нет.Если при разработке компилятора будет решено, какие типы лексических ошибок и как (согласно грамматике) они будут обрабатыватьсяОбычно все известные и наиболее часто используемые компиляторы обладают такими возможностями.

...