Снегопат https://snegopat.ru/forum/ |
|
lexer - я чего-то недопонял? https://snegopat.ru/forum/viewtopic.php?f=5&t=560 |
Страница 1 из 1 |
Автор: | quest [ 28 окт 2013, 23:37 ] |
Заголовок сообщения: | lexer - я чего-то недопонял? |
простая функция - function macrosTestLexer(){ var tw = GetTextWindow(); //debugger; if (!tw) return; var prgText = tw.text(); var parser = snegopat.parseSources(prgText) for(var i = 0, c = parser.lexemCount; i < c; i++) { var lex = parser.lexem(i) Message("type = "+lex.type+" text = "+lex.text+" "); } } еще более простой текст на входе x = "strin1 |strin2"; и неожиданный вывод type = 27 text = x type = 12 text = = type = 2 text = "strin1 type = 2 text = |strin2" type = 14 text = ; вопрос - почему строка разбилась на 2? второе ввод такой //@version: Версия 3 (28 октября 2013 г. 23:26:29) х = новый Структура("Возврат",""); х.Возврат = 1; Сообщить("х.Возврат = "+х.Возврат); вывод type = 1 text = //@version: Версия 3 (28 октября 2013 г. 23:26:29) type = 27 text = х type = 12 text = = type = 56 text = новый type = 27 text = Структура type = 8 text = ( type = 2 text = "Возврат" type = 13 text = , type = 2 text = "" type = 9 text = ) type = 14 text = ; type = 27 text = х type = 21 text = . type = 46 text = Возврат type = 12 text = = type = 4 text = 1 type = 14 text = ; type = 27 text = Сообщить type = 8 text = ( type = 2 text = "х.Возврат = " type = 15 text = + type = 27 text = х type = 21 text = . type = 46 text = Возврат type = 9 text = ) type = 14 text = ; почему имя поля имеет тип 46? должно же быть 27, ведь после точки не может идти ключевоое слово? Это можно исправить? если да - то попутно просьба - сделай деление коментов на два - начинающийся с начала строки (любая последовательностей пробелов и табов за которыми идет //) и простой комент который после кода пишеться И в документации можно поправиь - кроме абревеатууры написать еще и числовое значение типа а еще небольшой, но неприятный баг. при попытке забобрать код где есть лексема &УбитьЛексер! просиходит падение |
Автор: | quest [ 28 окт 2013, 23:38 ] |
Заголовок сообщения: | Re: lexer - я чего-то недопонял? |
забобрать читать как разобрать |
Автор: | artbear [ 29 окт 2013, 09:44 ] |
Заголовок сообщения: | Re: lexer - я чего-то недопонял? |
Полуофф. использование УбитьЛексер убивает лексер, все верно |
Автор: | orefkov [ 29 окт 2013, 15:09 ] |
Заголовок сообщения: | Re: lexer - я чего-то недопонял? |
Сразу хочу сказать - лексер это не синтакический анализатор. Его цель - разбить текст на поток лексем. Он просто не должен помнить, что было до текущей лексемы, тупо выдает все что встретит. То, что ключевые слова после точки (а если точнее, в качестве имен методов и свойств объекта) допустимы - это уже задача синтакс-анализатора, а не лексера. Отсюда и по поводу многострочных строк. В лексере как и в 1С принята парадигма - лексема может размещаться на одной строке. Поэтому лексером что открытый строковый литерал (не завершающийся кавычкой), что начинающийся с "|" - определяется как обычный строковый литерал. Дальнейшая их склейка и анализ правильности делается синтакс-анализатором. Как повод задуматься - в "середине" многострочных литералов вполне возможны комментарии. |
Автор: | quest [ 29 окт 2013, 16:13 ] |
Заголовок сообщения: | Re: lexer - я чего-то недопонял? |
Факт. не учел что могут быть комменты так расположны. За ответ спасибо, |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |