diff options
| author | Paul Buetow <paul@buetow.org> | 2025-03-16 22:06:58 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2025-03-16 22:06:58 +0200 |
| commit | 7cae9d4881019c4676d7cbe2e5f638c2c28ba763 (patch) | |
| tree | ef841ef0cac3edf16ccad5f1cb5e848f99daebec /internal/generated/nqc.raku | |
| parent | 3ebafeb4dec7c5029cc42e0f9ea38f84691b5453 (diff) | |
refactor directories
Diffstat (limited to 'internal/generated/nqc.raku')
| -rw-r--r-- | internal/generated/nqc.raku | 197 |
1 files changed, 0 insertions, 197 deletions
diff --git a/internal/generated/nqc.raku b/internal/generated/nqc.raku deleted file mode 100644 index be4345e..0000000 --- a/internal/generated/nqc.raku +++ /dev/null @@ -1,197 +0,0 @@ -#!/usr/bin/env raku -# -# This Raku program takes a list of C struct and constant definitions and converts -# it to valid Go code. - -use v6.d; -#use Grammar::Debugger; - -# Not quite C -grammar NQC { - rule TOP { <construct>* } - rule construct { <constant> | <statement> | <comment> } - rule constant { '#define' <identifier> <number> } - rule statement { <struct> ';' } - rule struct { 'struct' <identifier> '{' <member>+ %% ';' '}' } - rule member { <type> <identifier> <arraysize>? } - rule comment { <single-line-comment> | <multi-line-comment> } - rule single-line-comment { '//' <-[\n]>+ } - rule multi-line-comment { '/*' .*? '*/' } - token arraysize { '[' <identifier> ']' } - token type { 'char' | '__s32' | '__u32' | '__s64' | '__u64' } - token identifier { <[a..z A..Z 0..9 _]>+ } - token number { \d+ } -} - -class Constant { - has Str $.name is required; - has Int $.value is required; -} - -role StructGoMethods { - method struct-go-methods($/) returns Str { - my Str $self-ref = $<identifier>.lc.substr(0,1); - my Str @format = $<member>.map({ $_.<identifier>.made ~ ':%v' }); - - my Str @args = $<member>.map({ - my Str $ref = "$self-ref." ~ $_.<identifier>.made; - # Need to convert char-arrays into a Go slice, and then convert via string(...) - ($_.<type> eq 'char' && $_.<arraysize>) ?? "string({$ref}[:])" !! $ref; - }); - - qq:to/END/; - func ($self-ref {$<identifier>.made}) String() string \{ - return fmt.Sprintf("{@format.join(' ')}", {@args.join(', ')}) - \} - - func ($self-ref *{$<identifier>.made}) GetEventType() EventType \{ - return $self-ref.EventType - \} - - func ($self-ref *{$<identifier>.made}) GetTraceId() TraceId \{ - return $self-ref.TraceId - \} - - func ($self-ref *{$<identifier>.made}) GetPid() uint32 \{ - return $self-ref.Pid - \} - - func ($self-ref *{$<identifier>.made}) GetTid() uint32 \{ - return $self-ref.Tid - \} - - func ($self-ref *{$<identifier>.made}) GetTime() uint64 \{ - return $self-ref.Time - \} - END - } - - method struct-go-sync-pool($/) returns Str { - my Str $identifier = $/<identifier>.made; - my Str $self-ref = $identifier.lc.substr(0,1); - - qq:to/END/; - var poolOf{$identifier}s = sync.Pool\{ - New: func() interface\{\} \{ return &$identifier\{\} \}, - \} - - func New{$identifier}(raw []byte) *$identifier \{ - $self-ref := poolOf{$identifier}s.Get().(*$identifier); - if err := binary.Read(bytes.NewReader(raw), binary.LittleEndian, $self-ref); err != nil \{ - fmt.Println($self-ref, raw, len(raw), err) - panic(raw) - \} - return $self-ref - \} - - func ($self-ref *$identifier) Recycle() \{ - poolOf{$identifier}s.Put($self-ref) - \} - END - } -} - -role ConstantGoMethods { - has Constant @!constants; - - method constant-go-methods returns Str { - qq:to/END/; - type EventType uint32 - type TraceId uint32 - - var traceId2String = map[TraceId]string\{ - {@!constants.grep({ $_.name ~~ /^SYS_/ }).map({ - "{$_.value}: \"{$_.name.subst('SYS_', '').lc}\"" - }).join(', ')}, - \} - - var traceId2Name = map[TraceId]string\{ - {@!constants.grep({ $_.name ~~ /^SYS_/ }).map({ - "{$_.value}: \"{$_.name.subst(/'SYS_ENTER_'|'SYS_EXIT_'/, '').lc}\"" - }).join(', ')}, - \} - - func (s TraceId) String() string \{ - str, ok := traceId2String[s] - if !ok \{ - panic(fmt.Sprintf("no string representation for trace ID %d found", s)) - \} - return str - \} - - func (s TraceId) Name() string \{ - str, ok := traceId2Name[s] - if !ok \{ - panic(fmt.Sprintf("no name for trace ID %d found", s)) - \} - return str - \} - END - } - -} - -class NQCToGoActions does StructGoMethods does ConstantGoMethods { - has Bool $!constant-type-set; - - method TOP($/) { - make qq:to/END/; - // Code generated - don't change manually! - package types - - {self.constant-go-methods} - {$<construct>.map(*.made).join('')} - END - } - - method construct($/) { - make $<constant>.made // $<statement>.made // ''; - } - - method statement($/) { - make "\n" ~ $<struct>.made; - } - - method constant($/) { - push @!constants: Constant.new(:name(~$<identifier>), :value(+$<number>)); - my $const-type = $<identifier>.starts-with('SYS_') ?? ' TraceId ' !! ''; - - make qq:to/END/; - const {$<identifier>}$const-type = {$<number>} - END - } - - method struct($/) { - make qq:to/END/; - type {$<identifier>.made} struct \{ - {$<member>.map(*.made).join('; ')} - \} - - {self.struct-go-methods($/)} - {($<identifier>.made.ends-with('Event') ?? "\n" ~ self.struct-go-sync-pool($/) !! '')} - END - } - - method member($/) { - my Str $type = $<identifier>.made eq 'TraceId' ?? 'TraceId' !! $<type>.made; - $type = 'EventType' if $<identifier>.made eq 'EventType'; - make $<identifier>.made ~ ' ' ~ ($<arraysize> // '') ~ $type; - } - - method type($/) { - make do given ~$/ { - when 'char' { 'byte' } - when '__s32' { 'int32' } - when '__u32' { 'uint32' } - when '__s64' { 'int64' } - when '__u64' { 'uint64' } - } - } - - method identifier($/) { - # Convert identifier from snake_case (C) to CamelCase (Go) - make $/.Str.split('_').map(*.tc).join(''); - } -} - -say NQC.parse($*IN.slurp, actions => NQCToGoActions.new).made; |
