2010-06-25 3 views
0

Я пытаюсь сделать корректор текста sintax для класса моих компиляторов. Идея такова: у меня есть некоторые правила, которые присущи языку (в моем случае, португальцу), например «Действительная фраза - SUBJECT VERB ADJECTIVE», как в «Ruby is great».Как создать парсер, который токенизирует список слов, взятых из файла?

Хорошо, поэтому сначала я должен сделать токенизацию ввода «Рубин большой». Поэтому у меня есть текстовый файл «глаголы», с множеством глаголов, один за другим. Тогда у меня есть один текст «прилагательные», один «местоимение» и т.д.

Я пытаюсь использовать Ragel создать парсер, но я не знаю, как я мог бы сделать что-то вроде:

%%{ 
    machine test; 
    subject = <open-the-subjects-file-and-accept-each-one-of-them>; 
    verb = <open-the-verbs-file-and-accept-each-one-of-them>; 
    adjective = <open-the-adjective-file-and-accept-each-one-of-them>; 
    main = subject verb adjective @ { print "Valid phrase!" } ; 
}%% 

Я посмотрел на ANTLR, Lex/Yacc, Ragel и т. Д. Но не смог найти тот, который, казалось, решил эту проблему. Единственный способ сделать это, о котором я мог думать, - это предварительно обработать входной файл Ragel, чтобы моя программа читала файл и записывала его содержимое в нужном месте. Но мне тоже не нравится это решение.

Кто-нибудь знает, как я могу это сделать? Нет проблем, если это не с Рагелем, я просто хочу решить эту проблему. Я бы хотел использовать Ruby или Python, но это тоже не обязательно.

Спасибо.

ответ

0

С бизоном я бы написал лексер вручную, который ищет слова в предопределенном словаре.

2

Если вы хотите читать файлы во время компиляции .. сделать их быть в формате:

subject = \ 
ruby|\ 
python|\ 
c++ 

затем использовать Ragel на «включить» или «импорт» заявление (я забыл, какой .. необходимо проверить руководство), чтобы импортировать его.


Если вы хотите, чтобы проверить список предметов во время выполнения, может быть, просто сделать Ragel прочитал 3 слова, то есть действие, связанное с каждым словом. Действие может читать файл и искать, если это хорошо или нет во время выполнения.

Действие считывает текстовый файл и сравнивает содержимое слова.

%%{ 
machine test 

action startWord { 
    lastWordStart = p; 
} 
action checkSubject { 
    word = input[lastWordStart:p+1] 
    for possible in open('subjects.txt'): 
     if possible == word: 
      fgoto verb 
    # If we get here do whatever ragel does to go to an error or just raise a python exception 
    raise Exception("Invalid subject '%s'" % word) 
} 
action checkVerb { .. exercise for reader .. ;) } 
action checkAdjective { .. put adjective checking code here .. } 

subject = ws*.(alnum*)>startWord%checkSubject 
verb := : ws*.(alnum*)>startWord%checkVerb 
adjective := ws*.)alnum*)>startWord%checkAdjective 
main := subject; 
}%% 
Смежные вопросы