Skip to content

Commit

Permalink
Work on automatic generation of field names.
Browse files Browse the repository at this point in the history
  • Loading branch information
VladD2 committed Jul 12, 2012
1 parent d80241e commit 35dcfe9
Show file tree
Hide file tree
Showing 74 changed files with 252 additions and 172 deletions.
Binary file modified Boot/Net-4.0/Nemerle.Compiler.dll
Binary file not shown.
Binary file modified Boot/Net-4.0/Nemerle.Macros.dll
Binary file not shown.
Binary file modified Boot/Net-4.0/Nemerle.Parser.Macro.Model.dll
Binary file not shown.
Binary file modified Boot/Net-4.0/Nemerle.Parser.Macro.Parser.dll
Binary file not shown.
Binary file modified Boot/Net-4.0/Nemerle.Parser.Macro.dll
Binary file not shown.
Binary file modified Boot/Net-4.0/Nemerle.Parser.dll
Binary file not shown.
Binary file modified Boot/Net-4.0/Nemerle.dll
Binary file not shown.
Binary file modified Boot/Net-4.0/ncc.exe
Binary file not shown.
Binary file modified Boot/Net-4.0/ncc32.exe
Binary file not shown.
Binary file modified Boot/Net-4.0/ncc64.exe
Binary file not shown.
5 changes: 4 additions & 1 deletion N2GlobalConfig.xml
Expand Up @@ -2,7 +2,10 @@
<Config>
<Properties>
<!--<N2BinPath>$N2Path\Nemerle.Parser.Macro.Parser\bin\Debug</N2BinPath>-->
<N2BinPath>$N2Path\Nemerle.Parser.Macro.Parser\bin\$Configuration</N2BinPath>
<!--<N2BinPath>$N2Path\Nemerle.Parser.Macro.Parser\bin\$Configuration</N2BinPath>-->
<!--<N2BinPath>$N2Path\Nemerle.Parser.Macro.Parser\bin\Release</N2BinPath>-->
<!--<N2BinPath>$N2Path\Nemerle.Parser.Macro.Parser-New\bin\Release</N2BinPath>-->
<N2BinPath>$N2Path\Nemerle.Parser.Macro.Parser-New\bin\$Configuration</N2BinPath>
</Properties>

<SpanClasses>
Expand Down
4 changes: 4 additions & 0 deletions Nemerle.Parser.Macro.Model/Grammar.n
Expand Up @@ -101,6 +101,7 @@ namespace Nemerle.Parser.Model
, rd.Id
, rd.Name
, rd.Attributes
, rd.TokenFieldNames
, rd.baseRuleName
, transformExtentionPrefix(rd)
)
Expand All @@ -111,6 +112,7 @@ namespace Nemerle.Parser.Model
, rd.Id
, rd.Name
, rd.Attributes
, rd.TokenFieldNames
, rd.baseRuleName
, rd.bindingPower
, transformExtentionPostfix(rd)
Expand All @@ -122,6 +124,7 @@ namespace Nemerle.Parser.Model
, rd.Id
, rd.Name
, rd.Attributes
, rd.TokenFieldNames
, rd.retType
, transformSimple(rd)
)
Expand All @@ -132,6 +135,7 @@ namespace Nemerle.Parser.Model
, rd.Id
, rd.Name
, rd.Attributes
, rd.TokenFieldNames
, transformRegular(rd)
)
}
Expand Down
11 changes: 11 additions & 0 deletions Nemerle.Parser.Macro.Model/Rule.n
Expand Up @@ -80,5 +80,16 @@ namespace Nemerle.Parser.Model
| And(rule) => $"&$(p(rule))"
}
}

public GetSubRules() : list[Rule]
{
match (this)
{
| Rule.Sequence(rules) => rules.Filter(rule => !(rule.Type is RuleType.Void));
//| _ when rule.Type is RuleType.Void => assert(false);
//| _ => [rule]
| _ => assert(false);
}
}
}
}
29 changes: 27 additions & 2 deletions Nemerle.Parser.Macro.Model/RuleAttribute.n
Expand Up @@ -20,9 +20,34 @@ namespace Nemerle.Parser.Model
public variant RuleAttribute : Nemerle.Compiler.Located
{
| StartRule
| Ast { names : list[NameRef]; }
| Ast
{
names : list[NameRef];
public GetNames(rd : RuleDefinition) : list[NameRef]
{
def makeName(name : NameRef, rule : Rule) : NameRef
{
def makeNameForRule(rule : Rule) : NameRef
{
| String(str) when rd.TokenFieldNames.Contains(str) => rd.TokenFieldNames.Get(str)
| String(str) => Message.FatalError(rule.Location, $<#Name for literal "$str" not defined. You should define by 'token field Name = String;' statement.#>)
| Call(name, _) => name
| _ => Message.FatalError(rule.Location, $<#Name for rule "$rule" not defined.#>)
}

match (name.Parts)
{
| ["_"] => makeNameForRule(rule)
| [_] => name
| _ => assert2(false); assert(false);
}
}

NList.Map2(names, rd.GetSubRules(), makeName)
}
}
| SpanClass { name : NameRef; }

public static GetUsages() : string
{
def ty = typeof(this);
Expand Down
22 changes: 18 additions & 4 deletions Nemerle.Parser.Macro.Model/RuleDefinition.n
Expand Up @@ -12,11 +12,12 @@ namespace Nemerle.Parser.Model
[Record]
public variant RuleDefinition : Nemerle.Compiler.Located
{
public Id : int { get; }
public Name : NameRef { get; }
public Attributes : list[RuleAttribute] { get; }
public Id : int { get; }
public Name : NameRef { get; }
public Attributes : list[RuleAttribute] { get; }
public TokenFieldNames : Map[string, NameRef] { get; }

public IsAst : bool { get { Attributes.Exists(_ is RuleAttribute.Ast) } }
public IsAst : bool { get { Attributes.Exists(_ is RuleAttribute.Ast) } }
public IsExtention : bool { get { this is RuleDefinition.ExtentionPrefix || this is RuleDefinition.ExtentionPostfix } }

| ExtentionPoint { retType : RuleType; }
Expand All @@ -39,6 +40,19 @@ namespace Nemerle.Parser.Model
}
}

public GetSubRules() : list[Rule]
{
match (this)
{
| ExternalRule
| Regular
| ExtentionPoint => []
| ExtentionPrefix as rd => rd.rule.GetSubRules()
| ExtentionPostfix as rd => rd.rule.GetSubRules()
| Simple as rd => rd.rule.GetSubRules()
}
}

public override Equals(that : object) : bool
{
match (that)
Expand Down
3 changes: 3 additions & 0 deletions Nemerle.Parser.Macro.Parser/GrammarParser2.n2
Expand Up @@ -163,6 +163,9 @@ syntax module GrammarParser2
[Ast( Span, Class, Name, MatchTokens, Semicolon)]
syntax SpanClass is Declaration = "span"S "class"S Identifier ("="s TokenRule)? ";"s;

[Ast( Span, Class, Name, Eq, StringLiteral, Semicolon)]
syntax TokenField is Declaration = "token"S "field"S Identifier "="s StringLiteral ";"s;

[Ast( Brackets, Open, Comma, Close, Semicolon)]
syntax BracketPair is Declaration = "brackets"S TokenRule ","s TokenRule ";"s;

Expand Down
Expand Up @@ -12,7 +12,7 @@ using Nemerle.Parser.Internal;

namespace Nemerle.Parser
{
partial internal class GrammarCompiler
internal partial class GrammarCompiler
{
[Memoize]
public BindFixedType(ty : PExpr) : FixedType
Expand Down
Expand Up @@ -12,7 +12,7 @@ using Nemerle.Parser.Internal;

namespace Nemerle.Parser
{
partial internal class GrammarCompiler
internal partial class GrammarCompiler
{
public DefineAllMethods() : void
{
Expand Down
Expand Up @@ -14,7 +14,7 @@ using Nemerle.Imperative;

namespace Nemerle.Parser
{
partial internal class GrammarCompiler
internal partial class GrammarCompiler
{
[Memoize]
public DefineAstType(rd : RuleDefinition) : TypeBuilder
Expand Down Expand Up @@ -47,12 +47,15 @@ namespace Nemerle.Parser
foreach (rd when rd.IsAst in TypedGrammar.Rules)
{
def tb = DefineAstType(rd);

match (rd.Attributes.Find(_ is RuleAttribute.Ast), GetAstFieldsTypes(rd))
{
| (Some(RuleAttribute.Ast as ast), None) with args = []
| (Some(RuleAttribute.Ast as ast), Some(args)) =>
when (args.Length != ast.names.Length)
Message.Error(ast.Location, $"Expected $(args.Length) member got $(ast.names.Length)");
def fieldNames = ast.GetNames(rd);

when (args.Length != fieldNames.Length)
Message.Error(ast.Location, $"Expected $(args.Length) member got $(fieldNames.Length)");
tb.DefineNestedType(<[decl:
public partial new class Error : $(tb.GetMemType() : typed)
{
Expand Down Expand Up @@ -84,7 +87,8 @@ namespace Nemerle.Parser
{
}
]>);
def members = ast.names.Map(_.AsName).Zip(args);

def members = ast.GetNames(rd).Map(_.AsName).Zip(args);

DefineAstFields(astTb, members);
DefineAstCtor(astTb, members);
Expand Down Expand Up @@ -191,14 +195,10 @@ namespace Nemerle.Parser
<[ { ..$exprs } ]>
}
def nameMap = SCG.Dictionary();
def rules = match (rule)
{
| Rule.Sequence(rules) =>
rules.Filter(rule => !(rule.Type is RuleType.Void));
| _ => assert(false);
}
assert(rules.Length == ast.names.Length);
foreach ((name, rule) in ast.names.Zip(rules))
def rules = rule.GetSubRules();
def fieldNames = ast.GetNames(rd);
assert(rules.Length == fieldNames.Length);
foreach ((name, rule) in fieldNames.Zip(rules))
nameMap[rule.Id] = name.AsName;
def getName(rule) : Name
{
Expand Down
Expand Up @@ -12,7 +12,7 @@ using Nemerle.Parser.Internal;

namespace Nemerle.Parser
{
partial internal class GrammarCompiler
internal partial class GrammarCompiler
{
public DefineDependencies() : void
{
Expand Down
Expand Up @@ -13,7 +13,7 @@ using Nemerle.Parser.Internal;

namespace Nemerle.Parser
{
partial internal class GrammarCompiler
internal partial class GrammarCompiler
{
[Record]
public class TokenErrorPosition
Expand Down
Expand Up @@ -12,7 +12,7 @@ using Nemerle.Parser.Internal;

namespace Nemerle.Parser
{
partial internal class GrammarCompiler
internal partial class GrammarCompiler
{
public DefineGrammarRefs() : void
{
Expand Down
Expand Up @@ -12,7 +12,7 @@ using Nemerle.Parser.Internal;

namespace Nemerle.Parser
{
partial internal class GrammarCompiler
internal partial class GrammarCompiler
{
public DefineInit() : void
{
Expand Down
Expand Up @@ -10,7 +10,7 @@ using SCG = System.Collections.Generic;

namespace Nemerle.Parser
{
partial internal class GrammarCompiler
internal partial class GrammarCompiler
{
private DefineInterfaceMembers() : void
{
Expand Down
Expand Up @@ -12,7 +12,7 @@ using Nemerle.Parser.Internal;

namespace Nemerle.Parser
{
partial internal class GrammarCompiler
internal partial class GrammarCompiler
{
private DefineLoadExtensionRules() : void
{
Expand Down
Expand Up @@ -10,7 +10,7 @@ using SCG = System.Collections.Generic;

namespace Nemerle.Parser
{
partial internal class GrammarCompiler
internal partial class GrammarCompiler
{
public DefineInterface(member : ClassMember) : void
{
Expand Down
Expand Up @@ -11,7 +11,7 @@ using SCG = System.Collections.Generic;

namespace Nemerle.Parser
{
partial internal class GrammarCompiler
internal partial class GrammarCompiler
{
private DefineParseMethods() : void
{
Expand Down
Expand Up @@ -12,7 +12,7 @@ using Nemerle.Parser.Internal;

namespace Nemerle.Parser
{
partial internal class GrammarCompiler
internal partial class GrammarCompiler
{
private DefineParsingErrors() : void
{
Expand Down
Expand Up @@ -12,7 +12,7 @@ using Nemerle.Parser.Internal;

namespace Nemerle.Parser
{
partial internal class GrammarCompiler
internal partial class GrammarCompiler
{
private DefineResetMemoization() : void
{
Expand Down
Expand Up @@ -13,7 +13,7 @@ using Nemerle.Parser.Internal;

namespace Nemerle.Parser
{
partial internal class GrammarCompiler
internal partial class GrammarCompiler
{
private DefineSaveState() : void
{
Expand Down
Expand Up @@ -13,7 +13,7 @@ using Nemerle.Parser.Internal;

namespace Nemerle.Parser
{
partial internal class GrammarCompiler
internal partial class GrammarCompiler
{
private MakeSpanClassFieldName(name : NameRef) : string
{
Expand Down
Expand Up @@ -13,7 +13,7 @@ using Nemerle.Parser.Internal;

namespace Nemerle.Parser
{
partial internal class GrammarCompiler
internal partial class GrammarCompiler
{
private MakeGrammarDescriptorImpl() : ClassMember.TypeDeclaration
{
Expand Down
Expand Up @@ -13,7 +13,7 @@ using Nemerle.Parser.Internal;

namespace Nemerle.Parser
{
partial internal class GrammarCompiler
internal partial class GrammarCompiler
{
private MakeGrammarImpl() : ClassMember.TypeDeclaration
{
Expand Down
Expand Up @@ -13,7 +13,7 @@ using Nemerle.Parser.Internal;

namespace Nemerle.Parser
{
partial internal class GrammarCompiler
internal partial class GrammarCompiler
{
private MakeGrammarStateImpl() : ClassMember.TypeDeclaration
{
Expand Down
Expand Up @@ -13,7 +13,7 @@ using Nemerle.Parser.Internal;

namespace Nemerle.Parser
{
partial internal class GrammarCompiler
internal partial class GrammarCompiler
{
private MakeParsingErrorsImpl() : ClassMember.TypeDeclaration
{
Expand Down
Expand Up @@ -11,7 +11,7 @@ using SCG = System.Collections.Generic;

namespace Nemerle.Parser
{
partial internal class GrammarCompiler
internal partial class GrammarCompiler
{
public MakePublicRuleName(name : NameRef) : string
{
Expand Down
Expand Up @@ -11,7 +11,7 @@ using SCG = System.Collections.Generic;

namespace Nemerle.Parser
{
partial internal class GrammarCompiler
internal partial class GrammarCompiler
{
public CompileGrammar() : void
{
Expand Down

0 comments on commit 35dcfe9

Please sign in to comment.