Опция разбора токена - PullRequest
0 голосов
/ 30 июня 2018

Рассмотрим немного другой пример с игрушкой из моего предыдущего вопроса :

. local string my first name is Pearly,, and my surname is Spencer

. tokenize "`string'", parse(",,")

. display "`1'"
my first name is Pearly

. display "`2'"
,

. display "`3'"
,

. display "`4'"
and my surname is Spencer

У меня есть два вопроса:

  1. Работает ли tokenize, как ожидается, в этом случае? Я думал местный макрос 2 должно быть ,, вместо ,, тогда как локальный макрос 3 содержит остальную часть строки (а локальный макрос 4 будет пустым).

  2. Есть ли способ заставить tokenize уважать двойную запятую как разбор символ

1 Ответ

0 голосов
/ 02 июля 2018

tokenize - и gettoken тоже - из того, что я вижу, не примет повторные символы, такие как ,,, как составной символ разбора. ,, не является недопустимым как спецификация синтаксического анализа символов, но просто означает, что , и , являются приемлемыми символами синтаксического анализа. Повторение на практике игнорируется, так же как добавление слова «Меня зовут Жемчужина» после слова «Меня зовут Жемчужина» не добавляет информацию в разговор.

Резервное копирование: знайте, что без других инструкций (например, которые могут быть заданы командой syntax) Stata будет анализировать строку в соответствии с пробелами, за исключением того, что двойные кавычки (или составные двойные кавычки) связывают сильнее, чем разделенные пробелы.

tokenize - и gettoken тоже - примут несколько символов разбора pchars , а справка по tokenize дает пример с пробелом и знаком +. (По моему опыту, гораздо реже использовать пробел и запятую ,, когда синтаксис команды не совсем такой, какой syntax анализирует полностью.)

Разница между пробелом и другими символами синтаксического анализа заключается в том, что пробелы отбрасываются, но другие символы синтаксического анализа не отбрасываются. Обоснование здесь заключается в том, что эти персонажи часто имеют значение, которое вы, возможно, захотите продвинуть вперед. Таким образом, при настройке синтаксиса для опции команды вы можете разрешить что-то вроде myoption( varname [, suboptions ] ) и так, наличие запятой и других вещей важно для последующего кода.

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

Для чего стоит отметить, что при первом написании split я разрешил составные символы в качестве разделителей. Насколько я помню, поводом для этого стал вопрос о Statalist, который касался данных по судебным делам с множественными вариациями на VS (против), чтобы указать, какая сторона была какой. Этот пример выживает в помощь официальной команде.

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

...