Skip to content
This repository was archived by the owner on Jan 15, 2025. It is now read-only.

Commit 4aa848c

Browse files
authored
fix lu parser to accept quotes and interchanageable label in pharselist definition (#915)
* fix lu parser to accept doule quotes and interchanageable label in phraselist entity * optimize lexer and parser to loose the label defintion
1 parent 3786d10 commit 4aa848c

File tree

12 files changed

+1157
-977
lines changed

12 files changed

+1157
-977
lines changed

packages/lu/src/parser/lufile/LUFileLexer.g4

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,10 @@ NEW_ENTITY_TYPE_IDENTIFIER
130130
: S I M P L E | L I S T | R E G E X | P R E B U I L T | C O M P O S I T E | M L | P A T T E R N A N Y | P H R A S E L I S T | I N T E N T
131131
;
132132

133+
PHRASE_LIST_LABEL
134+
: '(' (~[\r\n])* ')'
135+
;
136+
133137
NEW_COMPOSITE_ENTITY
134138
: '[' (~[\r\n{}[\]()])* ']'
135139
;

packages/lu/src/parser/lufile/LUFileParser.g4

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,11 +121,11 @@ newEntityRoleOrFeatures
121121
;
122122

123123
newEntityName
124-
: NEW_ENTITY_IDENTIFIER
124+
: NEW_ENTITY_IDENTIFIER (WS* PHRASE_LIST_LABEL)?
125125
;
126126

127127
newEntityNameWithWS
128-
: NEW_ENTITY_IDENTIFIER_WITH_WS
128+
: NEW_ENTITY_IDENTIFIER_WITH_WS (WS* PHRASE_LIST_LABEL)?
129129
;
130130

131131
entitySection

packages/lu/src/parser/lufile/generated/LUFileLexer.interp

Lines changed: 4 additions & 1 deletion
Large diffs are not rendered by default.

packages/lu/src/parser/lufile/generated/LUFileLexer.js

Lines changed: 449 additions & 441 deletions
Large diffs are not rendered by default.

packages/lu/src/parser/lufile/generated/LUFileLexer.tokens

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,26 +19,27 @@ COMMA=18
1919
HAS_ROLES_LABEL=19
2020
HAS_FEATURES_LABEL=20
2121
NEW_ENTITY_TYPE_IDENTIFIER=21
22-
NEW_COMPOSITE_ENTITY=22
23-
NEW_REGEX_ENTITY=23
24-
NEW_ENTITY_IDENTIFIER=24
25-
NEW_ENTITY_IDENTIFIER_WITH_WS=25
26-
NEWLINE_IN_NAME=26
27-
IDENTIFIER=27
28-
DOT=28
29-
ESCAPE_CHARACTER=29
30-
EXPRESSION=30
31-
TEXT=31
32-
NEWLINE_IN_ENTITY=32
33-
COMPOSITE_ENTITY=33
34-
REGEX_ENTITY=34
35-
ENTITY_TEXT=35
36-
COLON_MARK=36
37-
NEWLINE_IN_QNA=37
38-
QNA_TEXT=38
22+
PHRASE_LIST_LABEL=22
23+
NEW_COMPOSITE_ENTITY=23
24+
NEW_REGEX_ENTITY=24
25+
NEW_ENTITY_IDENTIFIER=25
26+
NEW_ENTITY_IDENTIFIER_WITH_WS=26
27+
NEWLINE_IN_NAME=27
28+
IDENTIFIER=28
29+
DOT=29
30+
ESCAPE_CHARACTER=30
31+
EXPRESSION=31
32+
TEXT=32
33+
NEWLINE_IN_ENTITY=33
34+
COMPOSITE_ENTITY=34
35+
REGEX_ENTITY=35
36+
ENTITY_TEXT=36
37+
COLON_MARK=37
38+
NEWLINE_IN_QNA=38
39+
QNA_TEXT=39
3940
'$'=9
4041
'@'=10
4142
'='=17
4243
','=18
43-
'.'=28
44-
':'=36
44+
'.'=29
45+
':'=37

packages/lu/src/parser/lufile/generated/LUFileParser.interp

Lines changed: 3 additions & 1 deletion
Large diffs are not rendered by default.

packages/lu/src/parser/lufile/generated/LUFileParser.js

Lines changed: 576 additions & 492 deletions
Large diffs are not rendered by default.

packages/lu/src/parser/lufile/generated/LUFileParser.tokens

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,26 +19,27 @@ COMMA=18
1919
HAS_ROLES_LABEL=19
2020
HAS_FEATURES_LABEL=20
2121
NEW_ENTITY_TYPE_IDENTIFIER=21
22-
NEW_COMPOSITE_ENTITY=22
23-
NEW_REGEX_ENTITY=23
24-
NEW_ENTITY_IDENTIFIER=24
25-
NEW_ENTITY_IDENTIFIER_WITH_WS=25
26-
NEWLINE_IN_NAME=26
27-
IDENTIFIER=27
28-
DOT=28
29-
ESCAPE_CHARACTER=29
30-
EXPRESSION=30
31-
TEXT=31
32-
NEWLINE_IN_ENTITY=32
33-
COMPOSITE_ENTITY=33
34-
REGEX_ENTITY=34
35-
ENTITY_TEXT=35
36-
COLON_MARK=36
37-
NEWLINE_IN_QNA=37
38-
QNA_TEXT=38
22+
PHRASE_LIST_LABEL=22
23+
NEW_COMPOSITE_ENTITY=23
24+
NEW_REGEX_ENTITY=24
25+
NEW_ENTITY_IDENTIFIER=25
26+
NEW_ENTITY_IDENTIFIER_WITH_WS=26
27+
NEWLINE_IN_NAME=27
28+
IDENTIFIER=28
29+
DOT=29
30+
ESCAPE_CHARACTER=30
31+
EXPRESSION=31
32+
TEXT=32
33+
NEWLINE_IN_ENTITY=33
34+
COMPOSITE_ENTITY=34
35+
REGEX_ENTITY=35
36+
ENTITY_TEXT=36
37+
COLON_MARK=37
38+
NEWLINE_IN_QNA=38
39+
QNA_TEXT=39
3940
'$'=9
4041
'@'=10
4142
'='=17
4243
','=18
43-
'.'=28
44-
':'=36
44+
'.'=29
45+
':'=37

packages/lu/src/parser/lufile/parseFileContents.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,7 @@ const parseFeatureSections = function(parsedContent, featuresToProcess) {
462462
let intentExists = parsedContent.LUISJsonStructure.intents.find(item => item.name === section.Name);
463463
if (intentExists !== undefined) {
464464
// verify the list of features requested have all been defined.
465-
let featuresList = section.Features.split(/[,;]/g).map(item => item.trim());
465+
let featuresList = section.Features.split(/[,;]/g).map(item => item.trim().replace(/^[\'\"]|[\'\"]$/g, ""));
466466
(featuresList || []).forEach(feature => {
467467
let entityExists = (parsedContent.LUISJsonStructure.flatListOfEntityAndRoles || []).find(item => item.name == feature || item.name == `${feature}(interchangeable)`);
468468
let featureIntentExists = (parsedContent.LUISJsonStructure.intents || []).find(item => item.name == feature);
@@ -1096,7 +1096,12 @@ const parseAndHandleEntityV2 = function (parsedContent, luResource, log, locale)
10961096
if (entities && entities.length > 0) {
10971097
for (const entity of entities) {
10981098
if (entity.Type !== INTENTTYPE) {
1099-
entity.Name = entity.Name.replace(/^[\'\"]|[\'\"]$/g, "");
1099+
if (entity.Name.endsWith(PLCONSTS.INTERCHANGEABLE)) {
1100+
entity.Name = entity.Name.slice(0, entity.Name.length - PLCONSTS.INTERCHANGEABLE.length).trim().replace(/^[\'\"]|[\'\"]$/g, "") + PLCONSTS.INTERCHANGEABLE
1101+
} else {
1102+
entity.Name = entity.Name.replace(/^[\'\"]|[\'\"]$/g, "");
1103+
}
1104+
11001105
let entityName = entity.Name.endsWith('=') ? entity.Name.slice(0, entity.Name.length - 1) : entity.Name;
11011106
let entityType = !entity.Type ? getEntityType(entity.Name, entities) : entity.Type;
11021107
if (!entityType) {

packages/lu/test/commands/luis/convert.test.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,10 @@ describe('luis:convert', () => {
9393
await assertToJSON('./../../fixtures/examples/9a.lu', './../../fixtures/verified/9a.json', '9a')
9494
})
9595

96+
it('luis:convert phraselist entity types are parsed correctly', async () => {
97+
await assertToJSON('./../../fixtures/examples/13.lu', './../../fixtures/verified/13.json', '13')
98+
})
99+
96100
it('Parse to LU instance', async () => {
97101
let luFile = `
98102
@ ml test

0 commit comments

Comments
 (0)