define tokens for lexing set [] in, yield [] operations
This commit is contained in:
parent
2634e35a01
commit
a7dad0d3e5
4 changed files with 97 additions and 1 deletions
|
@ -71,7 +71,7 @@ set VOWELS = { ORAL_VOWELS or NASAL_VOWELS }
|
|||
|
||||
set PHONES = { VOWELS or CONSONANTS }
|
||||
|
||||
print [ GLOBAL ]
|
||||
; print [ GLOBAL ]
|
||||
|
||||
[lateral
|
||||
+=
|
||||
|
|
|
@ -98,6 +98,10 @@ export const lexer = moo.states({
|
|||
},
|
||||
identifier: /[A-Z]+[A-Z_]+/,
|
||||
whiteSpace: /[\t ]+/,
|
||||
openSquareBracket: /\]/,
|
||||
closeSquareBracket: /\[/,
|
||||
identifier: /[A-Z]+[A-Z_]*/,
|
||||
phone: /[\u00c0-\u03FFa-z]+/,
|
||||
newLine: { match: /\n/, lineBreaks: true }
|
||||
},
|
||||
|
||||
|
|
|
@ -208,4 +208,90 @@ set CLICK_CONSONANTS = { TENUIS_CLICK_CONSONANTS or VOICED_CLICK_CONSONANTS
|
|||
{ type: 'closeCurlyBracket', value: '}'}
|
||||
]
|
||||
},
|
||||
setDefinitionYield: {
|
||||
latl: `
|
||||
set NASAL_VOWELS = { [ V ] in ORAL_VOWELS yield [ Ṽ ] },
|
||||
SHORT_NASAL_VOWELS = { [ Vː ] in NASAL_VOWELS yield [ V ]ː },
|
||||
LONG_NASAL_VOWELS = { [ Vː ] in NASAL_VOWELS }`,
|
||||
tokens: [
|
||||
{ type: 'whiteSpace', value: '\n', },
|
||||
{ type: 'kw-set', value: 'set', },
|
||||
{ type: 'whiteSpace', value: ' ', },
|
||||
{ type: 'setIdentifier', value: 'NASAL_VOWELS', },
|
||||
{ type: 'whiteSpace', value: ' ', },
|
||||
{ type: 'equal', value: '=', },
|
||||
{ type: 'whiteSpace', value: ' ', },
|
||||
{ type: 'openCurlyBracket', value: '{', },
|
||||
{ type: 'whiteSpace', value: ' ', },
|
||||
{ type: 'closeSquareBracket', value: '[', },
|
||||
{ type: 'whiteSpace', value: ' ', },
|
||||
{ type: 'identifier', value: 'V', },
|
||||
{ type: 'whiteSpace', value: ' ', },
|
||||
{ type: 'openSquareBracket', value: ']', },
|
||||
{ type: 'whiteSpace', value: ' ', },
|
||||
{ type: 'kw-set-in', value: 'in', },
|
||||
{ type: 'whiteSpace', value: ' ', },
|
||||
{ type: 'identifier', value: 'ORAL_VOWELS', },
|
||||
{ type: 'whiteSpace', value: ' ', },
|
||||
{ type: 'kw-set-yield', value: 'yield', },
|
||||
{ type: 'whiteSpace', value: ' ', },
|
||||
{ type: 'closeSquareBracket', value: '[', },
|
||||
{ type: 'whiteSpace', value: ' ', },
|
||||
{ type: 'identifier', value: 'V', },
|
||||
{ type: 'phone', value: '̃', }, // test display for COMBINING TILDE OVERLAY is deceiving
|
||||
{ type: 'whiteSpace', value: ' ', },
|
||||
{ type: 'openSquareBracket', value: ']', },
|
||||
{ type: 'whiteSpace', value: ' ', },
|
||||
{ type: 'closeCurlyBracket', value: '}', },
|
||||
{ type: 'comma', value: ',', },
|
||||
{ type: 'whiteSpace', value: '\n ', },
|
||||
{ type: 'setIdentifier', value: 'SHORT_NASAL_VOWELS', },
|
||||
{ type: 'whiteSpace', value: ' ', },
|
||||
{ type: 'equal', value: '=', },
|
||||
{ type: 'whiteSpace', value: ' ', },
|
||||
{ type: 'openCurlyBracket', value: '{', },
|
||||
{ type: 'whiteSpace', value: ' ', },
|
||||
{ type: 'closeSquareBracket', value: '[', },
|
||||
{ type: 'whiteSpace', value: ' ', },
|
||||
{ type: 'identifier', value: 'V', },
|
||||
{ type: 'phone', value: 'ː', },
|
||||
{ type: 'whiteSpace', value: ' ', },
|
||||
{ type: 'openSquareBracket', value: ']', },
|
||||
{ type: 'whiteSpace', value: ' ', },
|
||||
{ type: 'kw-set-in', value: 'in', },
|
||||
{ type: 'whiteSpace', value: ' ', },
|
||||
{ type: 'identifier', value: 'NASAL_VOWELS', },
|
||||
{ type: 'whiteSpace', value: ' ', },
|
||||
{ type: 'kw-set-yield', value: 'yield', },
|
||||
{ type: 'whiteSpace', value: ' ', },
|
||||
{ type: 'closeSquareBracket', value: '[', },
|
||||
{ type: 'whiteSpace', value: ' ', },
|
||||
{ type: 'identifier', value: 'V', },
|
||||
{ type: 'whiteSpace', value: ' ', },
|
||||
{ type: 'openSquareBracket', value: ']', },
|
||||
{ type: 'phone', value: 'ː', },
|
||||
{ type: 'whiteSpace', value: ' ', },
|
||||
{ type: 'closeCurlyBracket', value: '}', },
|
||||
{ type: 'comma', value: ',', },
|
||||
{ type: 'whiteSpace', value: '\n ', },
|
||||
{ type: 'setIdentifier', value: 'LONG_NASAL_VOWELS', },
|
||||
{ type: 'whiteSpace', value: ' ', },
|
||||
{ type: 'equal', value: '=', },
|
||||
{ type: 'whiteSpace', value: ' ', },
|
||||
{ type: 'openCurlyBracket', value: '{', },
|
||||
{ type: 'whiteSpace', value: ' ', },
|
||||
{ type: 'closeSquareBracket', value: '[', },
|
||||
{ type: 'whiteSpace', value: ' ', },
|
||||
{ type: 'identifier', value: 'V', },
|
||||
{ type: 'phone', value: 'ː', },
|
||||
{ type: 'whiteSpace', value: ' ', },
|
||||
{ type: 'openSquareBracket', value: ']', },
|
||||
{ type: 'whiteSpace', value: ' ', },
|
||||
{ type: 'kw-set-in', value: 'in', },
|
||||
{ type: 'whiteSpace', value: ' ', },
|
||||
{ type: 'identifier', value: 'NASAL_VOWELS', },
|
||||
{ type: 'whiteSpace', value: ' ', },
|
||||
{ type: 'closeCurlyBracket', value: '}', },
|
||||
]
|
||||
}
|
||||
}
|
|
@ -49,5 +49,11 @@ describe('lexer', () => {
|
|||
const { latl, tokens } = assertionData.setDefinitionJoin;
|
||||
const stream = getStream(latl);
|
||||
expect(stream).toStrictEqual(tokens);
|
||||
});
|
||||
|
||||
it('lexes set definition with yield operation', () => {
|
||||
const { latl, tokens } = assertionData.setDefinitionYield;
|
||||
const stream = getStream(latl);
|
||||
expect(stream).toStrictEqual(tokens);
|
||||
})
|
||||
})
|
Loading…
Reference in a new issue