2016-03-12 3 views
1

Я пишу программу Prolog для токенизации. В настоящее время я могу получить список ASCII-кода, но я просто не знаю, как tokenize их вернуть список токенов.Как выделить элементы в списке по элементу?

Например, если у меня есть:

[105,110,116,32,105,110,116,32,97,32,13,10,105,110,116,32], 

как я получаю: [int,int,a,int]?

Я знаю, что ключ состоит в том, чтобы читать список на «32» и отделять все до 32 и добавлять [105,110,116], чтобы стать «int», я новичок в списке, поэтому я не знаком с Prolog. Любая помощь?

+1

Просто общее замечание: для обработки текста вы также можете использовать списки символов. Они гораздо читабельнее. В вашем случае: '[i, n, t, '', i, n, t, '', a, '', '\ r', '\ n', i, n, t, '']'. См. [This] (http://stackoverflow.com/a/8269897/772868) для получения дополнительной информации! – false

+0

Есть ли предикат для добавления '' к специальным символам типа '?' ? @false – zihaow

+0

У меня нет вашего вопроса. Список символов с '?' Is '"? "Или' [?] '. – false

ответ

1

Основные знания о DCG woudl быть полезным здесь. Предположим, вы получите код ASCII, используя read_lines_to_codes/2 т.е. read_lines_to_code(user_input,X). так со входом {} вы Получать X = [123, 125]. так с DCG определяется как та

lekserr(Tokens) --> 
( ("{", !, {Token = tkLbrabce } 
    ; "}", !, {Token = tkRBrace} 
    ; "int", !, {Token = tkInt} 
    ), 
    !, 
    {Tokens = [Token| TokList]}, 
    lekserr(TokList) 
; [], 
    {Tokens = []} 
). 

когда вы делаете

read_line_to_codes(user_input,X), phrase(lekserr(Y),X). 
| int 
X = [105, 110, 116], 
Y = [tkInt]. 

Это просто кратко и я надеюсь, что вы нашли это Usefull , рассмотрите добавление предложения, чтобы игнорировать пробелы.

Смежные вопросы