Если вы хотите выполнить произвольный анализ кода, вам нужен произвольный анализ / сопоставление / и т.д.
GCC-XML предоставит вам информацию декларации, но не содержание методов.
Наш инструментарий реинжиниринга программного обеспечения DMS будет предоставлять ту же абстрактную информацию, что и GCC-XML, но
дополнительно включить полную информацию о содержании определений (например, тело метода
информация), поддерживается его C ++ Front End . Это позволит вам получить доступ к материалам delcarations и для проверки программ ваших студентов.
DMS обеспечивает синтаксический анализ общего назначения для AST, таблиц символов и сопоставления исходного кода. Внешний интерфейс C ++ обеспечивает полный синтаксический анализ C ++, сборку CST A ++ и соответствующую символьную информацию. То, что вы делаете после этого для распознавания, зависит от вас, но ваш пример, похоже, касается поиска определенного паттерна.
Половина вашего примера будет обработана несколькими шаблонами исходного кода DMS для C ++:
pattern is_correct_student_class(m:members):class =
" class user { \m } ".
pattern is_correct_student_method_present(p:parameters,s:statements):method =
" const get_name(\p) { \s } "
(простите мой синтаксис C ++, я его мало пишу), который будет соответствовать любому AST,
соответственно соответствующий именованный пользовательский класс и требуемый метод const.
Кавычки являются мета-кавычками, а внутри содержится синтаксис C ++ с escape-символами.
\ p, \ m и \ s представляют мета-переменные p, m и s, которые должны быть синтаксически
список параметров, список методов и списки операторов соответственно, чтобы соответствовать шаблону. Определения списка параметров и т. Д. Выводятся автоматически
из грамматической части C ++ внешнего интерфейса C ++.
Другая половина реализована с помощью небольшого кода DMS PARLANSE, выполняемого после
вызов синтаксического анализатора C ++ и преобразователя имени / типа:
(define has_student_code (lamdba (function boolean [tree AST]))
(AST:IsInTree tree
(lambda (function boolean [tree1 AST]
(&& (Registry:MatchPattern tree1 "is_correct_student_class")
(AST:IsInList (AST:GetNthGrammarChild tree1 4) ; the member list
(lambda (function boolean [tree2 AST])
(Registry:MatchPattern tree2 ; a member
"is_correct_student_method_present")
)lambda
)lambda
)
)define
с некоторыми свободами, взятыми для упрощения изложения.
Это довольно простая проверка; Вы можете получить доступ к таблице символов из кода PARLANSE, чтобы выполнить более сложную проверку, если это имеет смысл.
Хотя DMS не работает непосредственно под Linux, похоже, она работает под Wine.