Чи можливо створити мову, яка не має синтаксичних помилок? [зачинено]


14

Іншими словами, мова, де кожен можливий рядок є синтаксисом?

EDIT : Це теоретичне питання.
Я не маю інтересу використовувати таку мову; Я просто запитую, чи це можливо.

Подальше редагування

Я пішов наперед розробленою такою мовою. Див. ErrorFree


2
Якби ми могли це зробити, ми створили б AI.
Майкл К

5
@Michael: Ні; Я не думаю, що так.
СЛАкс

7
!!! Перл !!!

8
Я рішуче заперечую проти закритого питання! Це ні суб'єктивно, ні не конструктивно !!!
Фелікс Домбек

1
чому б не взяти мову складання з: зокрема 256 інструкцій, 128 регістрів і загального синтаксису instruction operand*, де операнд може бути регістром або числом між 0-127 (і все вище, що трактується як регістр) і якщо операнд відсутня для вказівки з декількома arity, "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
Михайло: Точно. Все синтаксично дійсне, але це, можливо, може бути НОП (не має особливого значення). Нічого поганого в тому, що мова ігнорує багато чого. Просто подивіться на всі речі, які C ігнорує у цій прикладі програми: int main () {3 ;;; / * коментар * /}
користувач281377

Багато людей кажуть «ні», оскільки не мають концептуальної різниці між синтаксисом і семантикою. "Це не компілюється? Це, мабуть, синтаксична помилка!"
fredoverflow

Багато людей кажуть «ні», оскільки в цьому немає реального значення. Як тільки ви додаєте структуру (тобто більше, ніж правило саморекурсивного розбору), у вас з’являється концепція синтаксису. Порушення структури - це синтаксична помилка. Помилка, спричинена синтаксисом, є помилкою синтаксису, незалежно від того, чи аналізує це аналізатор як такий чи ні.
Берін Лорич

5

Я думаю, це залежить від того, що ви маєте на увазі під правильним синтаксисом.

Ви можете створити мову, яка приймає будь-який рядок, але ігнорує все, що не було призначено певного значення. Це в основному еквівалент висловлювання "Я позбудусь синтаксичних помилок, але кажу, що вони не помилки" - досить безглуздо і дуже небажано з багатьох причин.

Крім того, єдиний спосіб, коли ви могли мати мову, яка не мала помилок у синтаксисі, полягала б у тому, щоб кожен можливий рядок мав дійсну інструкцію / використання, пов'язану з ним. Єдиний спосіб я бачу це зробити, щоб усі операції були окремими символами та переконався, що кожному символу була призначена операція.

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

Це теоретично можливо (AmmoQ вважає це набагато акуратніше, ніж я), але абсолютно небажаним.


Я читав, що TECO був таким, кожному символу присвоювали значення.
Девід Торнлі

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

Девід, ось що я думав, дуже подобається TECO. Хоча вхід IIRC TECO може містити синтаксичні помилки. Але це демонструє складність такої щільної мови - дуже важко читати та схильну до важких для розуміння помилок.
Омега Кентаври

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

5

Код нетекстовою мовою програмування може не мати синтаксичних помилок.

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


3

Сама мета синтаксису - розмежувати дійсне та недійсне способом, який швидше і ефективніше, ніж виконання коду. Синтаксис - це лише оптимізація, те, що йде в ньому і що переходить в семантику, є довільним.

Зазвичай ви хочете зовсім навпаки: зробити синтаксис розтягнутим, наскільки це можливо, щоб заощадити більше часу, але, звичайно, ви можете взагалі опустити синтаксис і оголосити кожну помилку семантичною: ви опинитесь нетокенізуючим інтерпретатором.


0

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

То що це означає?

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

Помилка синтаксису - це помилка, введена програмістами, що пише код, який не має значення для мови.

Позбутися синтаксичних помилок неможливо на основі наведеного вище визначення. Всі ми помилково визначили ідентифікатори, всі помилкові назви методів. Якщо мова мовчки сприймає помилки і радісно нічого не роблять, це не моя ідея приємного досвіду.

Можна створити мову, яка може використовувати будь-який дійсний символ унікоду (або послідовність символів) як ідентифікатори. Існують проблеми, такі як нормалізація еквівалентних послідовностей символів / символів, щоб вони були розпізнані як одне і те ж - але це можливо. ПРИМІТКА. Існує чотири стандартних типи нормалізації Unicode .


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

1
Порушують структуру і що відбувається?
Берін Лорич
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.