hold for now

This commit is contained in:
Rowan 2025-04-18 18:17:15 -05:00
parent da9d6680f8
commit a8219ce686
6 changed files with 99 additions and 27 deletions

6
package-lock.json generated
View file

@ -458,13 +458,13 @@
}, },
"node_modules/folktest": { "node_modules/folktest": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "git+https://git.kitsu.cafe/rowan/folktest.git#708d44f1215be33fcceba426029f44b4f963dbe5", "resolved": "git+https://git.kitsu.cafe/rowan/folktest.git#cbf48ff3b1334eb883f202a77a5bc89d24534520",
"dev": true, "dev": true,
"license": "GPL-3.0-or-later" "license": "GPL-3.0-or-later"
}, },
"node_modules/izuna": { "node_modules/izuna": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "git+https://git.kitsu.cafe/rowan/izuna.git#e11a0870c27eeb5ea1a4ae3fedccca008eda15c2", "resolved": "git+https://git.kitsu.cafe/rowan/izuna.git#4ab7c265d83856f2dc527780a3ac87b3d54676f1",
"license": "GPL-3.0-or-later" "license": "GPL-3.0-or-later"
}, },
"node_modules/kojima": { "node_modules/kojima": {
@ -479,7 +479,7 @@
}, },
"node_modules/kuebiko": { "node_modules/kuebiko": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "git+https://git.kitsu.cafe/rowan/kuebiko.git#81a33e4a98bf766dc08eb31adc04c35cec9685ab", "resolved": "git+https://git.kitsu.cafe/rowan/kuebiko.git#0ae5676c63df960dd6089a054a29212467aec397",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"izuna": "git+https://git.kitsu.cafe/rowan/izuna.git", "izuna": "git+https://git.kitsu.cafe/rowan/izuna.git",

30
src/parser/attributes.js Normal file
View file

@ -0,0 +1,30 @@
import { any, manymn } from 'kuebiko'
import { integerLiteral } from './literal'
const powOf = curry((y, x) => {
const result = Math.log(y) / Math.log(x)
return result === Math.floor(result)
})
const decorator = name => seq(char('@'), name)
const align = tag('align')
const binding = tag('binding')
const builtin = tag('builtin')
const compute = tag('compute')
const constant = tag('const')
const diagnostic = tag('diagnostic')
const fragment = tag('fragment')
const group = tag('group')
const id = tag('id')
const interpolate = tag('interpolate')
const invariant = tag('invariant')
const location = tag('location')
const blend_src = tag('blend_src')
const must_use = tag('must_use')
const size = tag('size')
const vertex = tag('vertex')
const workgroup_size = tag('workgroup_size')

View file

@ -4,12 +4,12 @@ import { char, until } from 'kuebiko'
const slash = char('\u002f') const slash = char('\u002f')
const asterisk = char('\u002a') const asterisk = char('\u002a')
const comment = seq(slash, slash) export const lineComment = seq(slash, slash)
const blockCommentStart = seq(slash, asterisk) const blockCommentStart = seq(slash, asterisk)
const blockCommentEnd = seq(asterisk, slash) const blockCommentEnd = seq(asterisk, slash)
const blockComment = seq( export const blockComment = seq(
blockCommentStart, blockCommentStart,
until(blockCommentEnd) until(blockCommentEnd)
) )

View file

@ -1,29 +1,68 @@
import { any, anyOf, digit, many, maybe, seq, str } from 'kuebiko' import { any, char, oneOf, digit, many, map, maybe, not, seq, tag } from 'kuebiko'
import { Token } from './token.js'
export class Literal extends Token {
constructor(value) {
super(value)
}
}
export class BooleanLiteral extends Token {
static from(value) {
return new BooleanLiteral(value)
}
}
export class IntegerLiteral extends Token {
_dataType
_system
constructor(value, type, system) {
super(value)
this._dataType = type
this._system = system
}
}
class Signed {
static Signed = new Signed(true)
static Unsigned = new Signed(false)
_value
constructor(value) {
this._value = value
}
}
export const iu = any(
map(() => Signed.Signed, char('i')),
map(() => Signed.Unsigned, char('u'))
)
const iu = anyOf('iu')
const decimal = char('.') const decimal = char('.')
const sign = anyOf('+-') const sign = oneOf('+-')
const e = anyOf('eE') const e = oneOf('eE')
const p = anyOf('pP') const p = oneOf('pP')
const fh = anyOf('fh') const fh = oneOf('fh')
export const zero = char('0') export const zero = char('0')
export const digits = many(digit) export const digits = many(digit)
export const booleanLiteral = any(str('true'), str('false')) export const booleanLiteral = any(
map(BooleanLiteral.from, tag('true')),
map(BooleanLiteral.from, tag('false')),
)
export const decimalIntLiteral = any( export const decimalIntLiteral = any(
zero,
seq( seq(
not(zero),
digits, digits,
maybe(iu) maybe(iu)
) )
) )
const hexDigit = any(digit, anyOf('abcdef'), anyOf('ABCDEF')) const hexDigit = any(digit, oneOf('abcdef'), oneOf('ABCDEF'))
const hexPrefix = seq(zero, anyOf('xX')) const hexPrefix = seq(zero, oneOf('xX'))
const hexIntLiteral = seq( const hexIntLiteral = seq(
hexPrefix, hexPrefix,
@ -32,12 +71,13 @@ const hexIntLiteral = seq(
) )
export const integerLiteral = any( export const integerLiteral = any(
zero,
decimalIntLiteral, decimalIntLiteral,
hexIntLiteral hexIntLiteral
) )
const nonzeroDigit = anyOf('123456789') const nonzeroDigit = oneOf('123456789')
const many1 = parser => seq(parser, many(parser)) const many1 = parser => seq(parser, many(parser))

8
src/parser/token.js Normal file
View file

@ -0,0 +1,8 @@
export class Token {
_value
constructor(value) {
this._value = value
}
}

View file

@ -1,17 +1,11 @@
import { it, assert } from 'folktest' import { it, assert } from 'folktest'
import { ident } from '../../src/parser/keyword.js' import { booleanLiteral, iu } from '../../src/parser/literal.js'
import { parse } from 'kuebiko'
export const Tests = [ export const Tests = [
it('whatever', () => { it('whatever', () => {
const pass1 = 'test1' console.log(parse(iu, 'i').chain(x => x))
const pass2 = '_Test2' console.log(parse(booleanLiteral, 'false').chain(x => x))
const fail1 = '_'
const fail2 = '__test'
const fail3 = 'default'
console.log(
ident
)
}) })
] ]