Можно ли спроектировать язык без синтаксических ошибок? [закрыто]


14

Другими словами, язык, где каждая возможная строка имеет правильный синтаксис?

РЕДАКТИРОВАТЬ : Это теоретический вопрос.
Я не заинтересован в использовании такого языка; Я просто спрашиваю, возможно ли это.

Дальнейшее редактирование

Я разработал такой язык. Смотрите ErrorFree


2
Если бы мы могли это сделать, мы бы создали ИИ.
Майкл К

5
@ Майкл: Нет; Я так не думаю.
SLaks

7
!!! Perl !!!

8
Я категорически против закрытия вопроса! Это не субъективно и не конструктивно !!!
Феликс Домбек

1
почему бы не взять ассемблер с: точно 256 инструкциями, 128 регистрами и общим синтаксисом instruction operand*, где операндом может быть регистр или число в диапазоне 0-127 (и все, что выше, рассматривается как регистр) и если операнд отсутствует для многоартериальной инструкции, предполагается «0».
Феликс Домбек

Ответы:


8

Да, если вы посмотрите на это очень аналитически, создав Детерминированную Машину Тьюринга, которая всегда останавливается в хорошем конечном состоянии для каждой отдельной строки определенного языка, то вы продемонстрировали, что это возможно. Демострация довольно проста: вам нужна обычная TM с функцией перехода только с одним переходом, который выглядит следующим образом:

TF(w,q) -> (w,Qa) 

Considerations:
    L = { w | w is any possible string }
    w e L
    q e Q
    F is a set with all good final states {Qa,Qr}
    Qa e F

Было доказано, что ТМ обладает той же вычислительной мощностью, что и любой другой реальный компьютер, поэтому это абсолютно возможно.


1
Что, черт возьми, это значит для нас, простых мирян? Что такое «w», «e», «L», «q», «Q», «Qa», «Qr», «F», «TF». Без какого-либо из этих определений у меня нет системы отсчета.
Берин Лорич

1
Извините, но нет простого способа объяснить подход Тьюринга к этому ответу. Проверьте эту ссылку, чтобы уточнить немного: en.wikipedia.org/wiki/Turing_machine
guiman

16

Да, конечно, это возможно, это даже тривиально легко.

<programm> ::= char | char <program> |

Я не понимаю, как кто-то может сказать «нет». Тем не менее, может быть довольно сложно определить значимую семантику для такого языка, но это также возможно. Просто посмотрите на пробелы .


Так что, если язык игнорирует это, это действительный systax? и не является ли tabtabspace допустимой строкой?
Майкл К

1
Семантика языка была моей проблемой с ним, но на самом деле не может обсуждать это, не переходя от темы к философии / лингвистике.
StuperUser

2
Майкл: Точно. Все синтаксически допустимо, но это может быть NOP (не имеет особого значения). Ничего плохого в том, что язык игнорирует множество вещей. Просто посмотрите на все, что C игнорирует в этом примере программы: int main () {3 ;;; / * комментарий * /}
user281377

Многие люди говорят «нет», потому что у них нет концептуального различия между синтаксисом и семантикой. «Это не компилируется? Должна быть синтаксическая ошибка!»
fredoverflow

Многие люди говорят «нет», потому что в этом нет никакого реального смысла. Как только вы добавляете структуру (т. Е. Больше, чем правило саморекурсивного разбора), у вас появляется концепция синтаксиса. Нарушение структуры является ошибкой, вызванной синтаксисом. Ошибка, вызванная синтаксисом, является ошибкой синтаксиса, независимо от того, помечает ли ее анализатор как таковой или нет.
Берин Лорич

5

Я думаю, это зависит от того, что вы подразумеваете под действительным синтаксисом.

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

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

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

Так что теоретически возможно (AmmoQ выражает это гораздо более аккуратно, чем я), но совершенно нежелательно.


Я читал, что TECO был таким, каждому персонажу присваивалось значение.
Дэвид Торнли

3
Машинный код работает примерно так. Каждую возможную комбинацию байтов можно рассматривать как программу, которая что- то делает , даже если все, что она делает, вызывает прерывание.
user281377

Дэвид, вот о чем я думал, очень похож на TECO. Хотя входные данные IIRC TECO могут содержать синтаксические ошибки. Но это демонстрирует сложность такого плотного языка - очень трудно читать и подвержен трудным для понимания ошибкам.
Омега Центавра

@ user281377: На 6502 есть довольно много инструкций без определенного значения. Некоторые имеют поведение, которое является последовательным, полезным и недоступным ни для одной документированной инструкции (мой любимый называется «DCP» - уменьшает адрес памяти и сравнивает результат с аккумулятором, устанавливая флажки соответствующим образом), но некоторые имеют поведение, которое зависит от время в шине странным и причудливым образом, а некоторые блокируют процессор достаточно сильно, чтобы потребовать перезагрузки (даже «немаскируемое» прерывание не поможет). Я думаю, что последние инструкции можно считать «синтаксическими ошибками».
суперкат

5

Код на нетекстовом языке программирования может не иметь синтаксических ошибок.

Я думаю о визуальном языке, как BYOB . Вы не можете случайно ввести «if x ten else foo», потому что «синтаксис» определяется графическими блоками.


3

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

Обычно вам требуется совсем противоположное: максимально расширить синтаксис, чтобы сэкономить больше времени, но, конечно, вы можете вообще исключить синтаксис и объявить каждую ошибку семантической: в итоге вы получите не токенизирующий интерпретатор.


0

Ahbefiasdlk aslerhsofa; f jwi [asdfasdf] aew / & Q! @ # $} {;-P

Так что это значит?

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

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

Невозможно избавиться от синтаксических ошибок на основе приведенного выше определения. Мы все неправильно определили идентификаторы, мы все неправильно назвали имена методов. То, что язык молча принимает неправильное написание и радостно ничего не делает, не является моей идеей приятного опыта.

Можно разработать язык, который может использовать любой допустимый символ Юникода (или последовательность символов) в качестве идентификаторов. Существуют проблемы, такие как нормализация эквивалентных символов / последовательностей символов, чтобы они распознавались как одно и то же, но это возможно. ПРИМЕЧАНИЕ. Существует четыре стандартных типа нормализации юникода .


1
Необходимость в структуре не требует грамматики. Рассмотрим Piet, где структура находится в позиции символа (или цвета) в сетке, а не в ее отношении к другим символам в морфеме.
Майк Самуэль

1
Нарушение структуры и что происходит?
Берин Лорич
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.