Один из способов сделать это, чтобы построить анализатор и prettyprinter. Синтаксический анализатор считывает исходный код и строит АСТ, фиксируя сущность структуры программы. Симпатичный принтер берет дерево, и регенерирует выход на основе структуры; таким образом, это «легко» для получения структурированного вывода. В качестве ключевого намека на каждый уровень языковая структура (классы, методы, блоки, циклы, условные выражения), , симпатичный принтер может отпечатать текст с отпечатками, чтобы дать хорошую структуру отступов.
Разборчивость и красивая печать - довольно сложные темы. Вместо повторения всего этого здесь вы можете увидеть мой SO answer on how to parse, with follow on discussion on how to build an AST. Prettyprinting не так хорошо известна, , но this SO answer of mine дает довольно полное описание о том, как это сделать.
Тогда у вас есть сложность определения фактической грамматики VB.net. Это требует большой работы, чтобы извлечь из справочной документации ... и это не совсем правильно, поэтому вам нужно проверить свой синтаксический анализатор на большом количестве кода, чтобы убедить себя в этом. Эта часть, к сожалению, просто потеет.
Учитывая программу niceprinter, OP может просто запустить ее как процесс форматирования файла.
Если вы это сделаете, то да, вы можете форматировать текст VB.net. Наш (автономный) форматировщик VB.net («DMSFormat ...») делает это выше, чтобы добиться красивой печати.
Учитывая файл "vb_example.сеть ":
Module Test
Public Shared Function CanReachPage(page As String) As Boolean
Try
Using client = New WebClient()
Using stream = client.OpenRead(page)
Return True
End Using
End Using
Catch
Return False
End Try
End Function
End Module
Следующая:
C:>DMSFormat VisualBasic~VBdotNet C:\temp\vb_example.net
производит:
VisualBasic~VBdotNet Formatter/Obfuscator Version 1.2.1
Copyright (C) 2010 Semantic Designs, Inc
Powered by DMS (R) Software Reengineering Toolkit
Parsing C:\temp\vb_example.net [encoding ISO-8859-1]
Module Test
Public Shared Function CanReachPage(page As String) As Boolean
Try
Using client = New WebClient()
Using stream = client.OpenRead(page)
Return True
End Using
End Using
Catch
Return False
End Try
End Function
End Module
который идентичен тому, что ОП хотел в своем примере
Вы можете легко направим отформатирован. содержимого программы в файл.
Вы можете предоставить инструменту файл проекта, и он будет отформатировать столько файлов, сколько вы указываете в файле проекта сразу.
Форматирует интегрированный полный парсер VB.net, и наш собственный весьма печатный механизм. Он анализирует текст источника точно (включая странный символ кодировок). Поскольку он использует надежный синтаксический анализатор и niceprinter, он не нарушит код.
Версия eval работает с файлами из нескольких сотен строк кода. Это может быть именно то, что вам нужно.
Я бы предоставил ссылку, но SO, похоже, не понравилось. Вы можете найти это через мою биографию.
Этот пример консоли, который вы нашли, работает не только на консоли. Это TextWriter, как и StreamWriter. Так что просто делайте это так же, передавая TextWriter через конструктор. –
@HansPassant - да, я собрал это, но не получается, что такое отступы? Он полагается на меня, зная, что «если строка начинается с« Использование », я должен отступать на один уровень» и т. Д. И т. Д. –
Ох. Да, написание того, что понимает синтаксис vb.net, - это совершенно другая игра с мячом. Раньше это было легко, но продолжение линии в наши дни необязательно, что должно дать вам серьезную мигрень. –