Звуко буквенный разбор слова имя: Фонетический разбор слова и звуко-буквеннный анализ

antlr4 — Устранение неоднозначности строковых литералов и идентификаторов без кавычек

Я унаследовал формат файла, который мало похож на следующий.

 какой-то блок {
  Виджет "Виджет 1" "Некоторое длинное необязательное описание" // Имя из нескольких слов в кавычках
  widget2 = Widget Widget2 "Другое длинное необязательное описание" // Однословное имя без кавычек
  widget3 = виджет три // нет описания
  dongle1 = ключ foo
  dongle2 = Dongle "bar baz" "какое-то длинное необязательное описание"
  Гаджет-молоток
}
 

Виджеты имеют имя и необязательное описание.

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

Виджетам может быть присвоен идентификатор (например, widget2 , widget3 ), или они могут быть анонимными, как в случае с первым виджетом выше.

Факт существования строковых литералов без кавычек и отсутствия ключевого слова (например,

let , var ) определены для объявления переменной. Я борюсь с тем, как смоделировать это в грамматике, чтобы синтаксический анализатор выполнял как можно больше работы. Могу ли я что-нибудь сделать, чтобы сказать: «Все, что предшествует = , является идентификатором (в отличие от строкового литерала)?

Надеюсь, кто-нибудь поможет мне. 2

Строка и ID почти наверняка будут токенами (произведенными Lexer).

Если ВСЕ виджета были названы, вы можете использовать режим Lexer для переключения в режим «после =, но перед комментарием или nl» и ввести новые новые правила Lexer (и использовать действие type() Lexer для назначения уже определенный тип лексемы

К сожалению, лексеры на самом деле не делают никакого прогноза, поэтому в настоящее время нет никакой возможности использовать тип правила лексера «что-то до.

..»

Эта грамматика, кажется, дает действительное дерево синтаксического анализа вашего ввода (с некоторыми предположениями, которые я должен сделать: интерпретация вашего ввода):

 грамматика FF
    ;
блок: ID '{' widget* '}' EOF;
виджет: (ID '=')? Описание названия виджета? КОММЕНТАРИЙ?;
имя: ID | НИТЬ;
описание: СТРОКА;
ВИДЖЕТ: «Виджет»;
ID: [a-zA-Z][a-zA-Z0-9]+;
STRING: '"' ~["]*? '"';
КОММЕНТАРИЙ: '//' ~[\n]*;
WS: [ \t\n]+ -> пропустить;
 

Результирующее дерево разбора:

3

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Требуется, но никогда не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

SIP: XML-литералы на основе имен — Процесс улучшения Scala xml

, которая не нужна каждому участнику этого потока. В этом посте я предложу альтернативное решение, отличное от простого удаления XML-литералов.

Фон

Основанный на имени для понимания доказал свою эффективность в разработке языка Scala. Выражение

for / yield будет преобразовано в вызовы функций более высокого порядка для методов flatMap , map и withFilter , независимо от того, к какому типу сигнатур они относятся. Понимание for можно использовать либо для Option , либо для List , даже если List имеет дополнительный неявный Параметр CanBuildFrom . Сторонние библиотеки, такие как Scalaz и Cats, также предоставляют Ops , чтобы разрешить монадические типы данных в для понимания .

Сопоставление с образцом на основе имени введено Dotty. Это значительно упрощает реализацию по сравнению со Scala 2. Кроме того, определенные символы в библиотеке Scala ( Option , Seq ) отделены от компилятора Scala.

Принимая во внимание успех вышеупомянутых синтаксических сахаров на основе имен, чтобы отделить scala-xml библиотека из компилятора Scala, XML-литерал на основе имени — очевидный подход.

Цели

  • Сохранение обратной совместимости на уровне исходного кода с существующими литералами XML на основе символов в большинстве случаев использования scala-xml
  • Разрешены литералы XML с поддержкой схемы, т. е. статический тип, изменяющийся в зависимости от имен тегов, аналогично текущему поведению TypeScript и Binding.scala.
  • XML-литералы с поддержкой схемы должны быть понятны как компилятору, так и IDE (например, не должны использоваться макросы белого ящика)
  • Существующие библиотеки, такие как ScalaTag, должны иметь возможность поддерживать литералы XML путем добавления нескольких простых классов-оболочек. Для авторов библиотек не требуются знания макросов или метапрограммирования.
  • Компилятор должен выставлять как можно меньше специальных имен, в случае невыносимо уродливого .

Нецели

  • Встраивание полнофункционального стандартного XML в Scala.
  • Разрешение произвольных имен тегов и имен атрибутов (или исключение зарезервированных слов).
  • Различение лексических различий, напр. против .

Предложение

Лексический синтаксис

Оставлен без изменений по сравнению со Scala 2.12

Литеральный перевод XML

Компилятор Scala преобразует литерал XML в Scala AST перед проверкой типов. Правила перевода:

Самозакрывающиеся теги без префиксов
 <имя-тега />
 

будет переведено в

 xml.tags.`tag-name`()
 
Самозакрывающиеся теги с некоторыми префиксами
 
 

будет преобразовано в

 xml.tags.`prefix-1`.`tag-name`()
 
Атрибуты
 
 

будет преобразовано в

 xml. tags.`tag-name`(
  xml.attributes.`атрибут-1`(xml.text("значение")),
  xml.attributes.`attribute-2`(xml.interpolation(f())),
  xml.attributes.`префикс-2`.`атрибут-3`(xml.interpolation("значение"))
)
 
CDATA

будет преобразован в xml.text("raw") если включен флаг -Xxml:coalescing или xml.cdata("raw") если флаг снят как -Xxml:-coalescing .

Инструкции процесса
 

будет переведено в

 xml.processInstructions.`xml-stylesheet`("type=\"text/xsl\" href=\"sty.xsl\"")
 
Дочерние узлы
 
  текст & усилитель; hшестнадцатеричная ссылка & dдесятичная ссылка
  <ребенок-1/>
  
  { math.random }
  
 

будет преобразовано в

 xml.tags.`tag-name`(
  xml.attributes. `атрибут-1`(xml.text("значение")),
  xml.текст("""
  текст """),
  xml.entities.amp,
  xml.text(""" шестнадцатеричная ссылка """),
  xml.entities.AMP,
  xml.text(""" десятичная ссылка
  """),
  xml.tags.`ребенок-1`(),
  xml.текст("""
  """),
  xml.comment("мой комментарий"),
  xml.текст("""
  """),
  xml.interpolation(math.random),
  xml.текст("""
  """),
  xml.cdata("raw"), // или xml.text("raw"), если установлен флаг `-Xxml:coalescing`
  xml.текст("""
""")
)
 

Обратите внимание, что шестнадцатеричные и десятичные ссылки не экранируются и автоматически преобразуются в xml.text() , а ссылки на сущности преобразуются в поля в xml.entities .

Поставщики библиотеки XML

Поставщик библиотеки XML должен предоставить пакет или объект с именем xml , который содержит следующие методы или значения:

  • теги
  • атрибуты
  • объектов
  • Инструкции по процессу
  • текст
  • комментарий
  • cданные
  • интерполяция

Пользователь библиотеки XML может переключаться между различными реализациями, импортируя различные пакеты или объекты xml . scala.xml используется по умолчанию, если нет явного импорта.

В XML-библиотеке с поддержкой схемы, такой как Binding.scala, ее методы тегов , атрибутов , processInstructions и объектов должны возвращать фабричные объекты, которые содержат все определения доступных имен тегов и имен атрибутов. Пользователь XML-библиотеки может предоставить дополнительные имена тегов и имена атрибутов в определяемых пользователем неявных классах для теги и атрибуты .

В XML-библиотеке без схемы, такой как scala-xml , ее тегов , атрибутов , processInstructions и объектов должны возвращать построители, которые расширяют scala.Dynamic для обработки имен тегов и имен атрибутов в selectDynamic или applyDynamic .

Известные проблемы

Конфликт имен

или не будет компилироваться из-за конфликта имен с

Any. toString .

  • Ошибка компиляции является желательным поведением в XML-библиотеке с поддержкой схемы, если toString не является допустимым именем в схеме. К счастью, в отличие от JSX,
    должен компилироваться, потому что класс является допустимым именем метода.
  • Пользователь библиотеки XML без схемы должен вместо этого явно создать new Elem("toString") .

Пробелы только текст

Адорат:

Следует ли сохранять текст, состоящий только из пробелов? Я спрашиваю об этом, потому что, если он сохранится, это не сработает:

 значение а = <а>
  <б/>

совпадение { case  => () }
 

Альтернативный подход

Инициализация XML может быть реализована в специальной интерполяции строк как xml"" . Плюсы и минусы этих подходов перечислены в следующей таблице:

XML-литералов на основе символов в Scala 2.

admin

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

2024 © Все права защищены.