【发布时间】:2015-05-04 15:27:14
【问题描述】:
我正在使用 Parsec 编写一个 Delphi 代码解析器,我当前的 AST 数据结构如下所示:
module Text.DelphiParser.Ast where
data TypeName = TypeName String [String] deriving (Show)
type UnitName = String
data ArgumentKind = Const | Var | Out | Normal deriving (Show)
data Argument = Argument ArgumentKind String TypeName deriving (Show)
data MethodFlag = Overload | Override | Reintroduce | Static | StdCall deriving (Show)
data ClassMember =
ConstField String TypeName
| VarField String TypeName
| Property String TypeName String (Maybe String)
| ConstructorMethod String [Argument] [MethodFlag]
| DestructorMethod String [Argument] [MethodFlag]
| ProcMethod String [Argument] [MethodFlag]
| FunMethod String [Argument] TypeName [MethodFlag]
| ClassProcMethod String [Argument] [MethodFlag]
| ClassFunMethod String [Argument] TypeName [MethodFlag]
deriving (Show)
data Visibility = Private | Protected | Public | Published deriving (Show)
data ClassSection = ClassSection Visibility [ClassMember] deriving (Show)
data Class = Class String [ClassSection] deriving (Show)
data Type = ClassType Class deriving (Show)
data Interface = Interface [UnitName] [Type] deriving (Show)
data Implementation = Implementation [UnitName] deriving (Show)
data Unit = Unit String Interface Implementation deriving (Show)
我想在我的 AST 数据结构中保留 cmets,我目前正试图弄清楚如何做到这一点。
我的解析器分为一个词法分析器和一个解析器(都用 Parsec 编写),我已经实现了注释标记的词法分析。
unit SomeUnit;
interface
uses
OtherUnit1, OtherUnit2;
type
// This is my class that does blabla
TMyClass = class
var
FMyAttribute: Integer;
public
procedure SomeProcedure;
{ The constructor takes an argument ... }
constructor Create(const Arg1: Integer);
end;
implementation
end.
令牌流如下所示:
[..., Type, LineComment " This is my class that does blabla", Identifier "TMyClass", Equals, Class, ...]
解析器将其翻译成:
Class "TMyClass" ...
Class 数据类型没有任何附加 cmets 的方法,并且由于 cmets(尤其是块 cmets)几乎可以出现在令牌流中的任何位置,我是否必须为 AST 中的所有数据类型添加可选注释?
如何处理我的 AST 中的 cmets?
【问题讨论】:
-
另见 stackoverflow.com/questions/9392546/… 并检查这些 AST 是如何定义的。例如,hackage.haskell.org/package/haskell-src-exts-1.16.0.1/docs/… 在注解中是多态的。
标签: delphi haskell comments abstract-syntax-tree