2017-01-13 10 views
0

Пытаясь намочить мои лексические анализаторы и генераторы парсера, я понял, что большинство ресурсов в Интернете (Tutorials, Forums, StackOverflow) говорят только о языках. Это потому, что такие инструменты, как Flex и Bison, подходят только для языков или это потому, что все, что может быть проанализировано, считается языком?Должен ли я использовать генераторы парсеров для чего угодно, кроме языка?

Чтобы быть более точным, у меня есть файл следующего вида:

File : Bananarama.xyz 
Date : 22.12.2017 

TableStart 
BlockStart 
Param1  : 12 
Param2  : 1.5 
Param3[lbs] : 1539 
Param4[cm] : 55 
BlockEnd 

BlockStart 
[...] 
BlockEnd 
TableEnd 

Является этот файл подходит для разобрана LALR-Parser?

ответ

2

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

Однако существуют различные способы структурирования символов для представления информации. Некоторые способы организации символов легче распознать, чем другие. К проще Я имею в виду с меньшим количеством кода, меньше времени, более простых алгоритмов. Некоторые из них сложнее.

То, что вы задаете, действительно переводится, «для этого примера расположения символов требуется, чтобы алгоритм этой сложности был распознан?»

Ответ простой Информатика. Я бы просто использовал Chomsky Hierarchy для оценки типа алгоритма, необходимого для синтаксического анализа (совпадения) последовательностей символов в файле.

Без дальнейших подробных пояснений достаточно сказать, что язык является либо типом 2, либо типом 3 и, безусловно, может быть проанализирован LALR-синтаксическим анализатором. Остается только решить оставшийся вопрос: является ли LALR-парсер слишком сложным для этого языка.

Может ли регулярная грамматика (и, следовательно, регулярные выражения) использоваться для этой задачи? Ваш пример файловой структуры на самом деле недостаточен для ответа на этот вопрос. Вам нужно знать, могут ли структуры быть вложенными или нет. Может ли БЛОК содержать БЛОК или нет?

Если нет гнездования, регулярные выражения достаточно мощные, и есть много инструментов, которые выполняют работу (например, egrep, perl, awk, sed, findstr).

+0

Ну, блок не может содержать другой блок, но я немного упростил этот пример. Все блоки окружены парой TableStart/TableEnd (я редактировал вопрос). Но это ничего не меняет, не так ли? – exilit

+0

Другой вопрос: не блокируют ли какие-либо контекстные чувствительности, чтобы он стал языком типа 1? – exilit

+0

@exilit Это только контекстная чувствительность, если символы в одном блоке изменяют синтаксис следующих блоков, то есть грамматика изменяется по мере совпадения символов. Из вашего примера это не так. Возможно, вы смешиваете синтаксис с семантикой данных. –