Представяне на знак в лексер

Пиша лексер в OCaml за малък език, имам част от неговата граматика, както следва:

tab-character = %x0009
eom-character = %x0019
space-character = %x0020
underscore = %x005F
single-quote = %x0027 ; '

Опитвам се да напиша let single_quote = [%x0027] в lexer.mll, но получавам грешка с незаконен знак по време на компилация,

Може ли някой да ми каже как да посоча такива числа като %x0027?

Компилацията работи с оператора let single_quote = ['''], виждал съм и друг начин за указване на знак, например let black = ['\009'],

Някой знае ли дали има разлика между тези 3 начина?


person SoftTimur    schedule 01.08.2012    source източник


Отговори (2)


Мисля, че питате за символни литерали в OCaml. Те са дефинирани в Раздел 6.1 от ръководството за OCaml.

За единични кавички можете да напишете '\'' или '\x27' или '\039'. Всички те са еквивалентни. Всички символни литерали са написани в единични кавички - няма форма, започваща с процент (%).

Регулярните изрази в ocamllex могат да съдържат символни литерали (както по-горе), които обозначават единични знаци, или низови литерали (в двойни кавички), които обозначават поредица от знаци. Низовите литерали следват същия модел като символните литерали. Низ, съдържащ само една кавичка, би бил "'" или "\'" или "\x27" или "\039".

Надявам се това да помогне.

Редактиране:

Да, ['\x09'] и '\x09' и "\x09" са еднакви, когато се разглеждат като регулярни изрази. Комплект с едно нещо в него обозначава същото нещо като това едно нещо само по себе си. По подобен начин последователност с дължина 1 е същата като само едно нещо.

Стойността 0x3000 в Unicode представлява "идеографско пространство" (използвано в китайски, японски и корейски предполагам). Работата с Unicode в OCaml е съвсем друга тема. Има Unicode библиотека за OCaml, наречена Camomile. Никога не съм го използвал, но е добре оценен от това, което съм виждал. Не мисля, че ocamllex работи с Unicode. Просто търся бързо в Google и виждам генератор на lexer, наречен ulex, който обработва Unicode. Сигурно има и други, това е само топ хитът на Google.

(Ами сега, виждам, че Джонатан Проценко вече е препоръчал ulex. Извинете за допълнителния шум.)

person Jeffrey Scofield    schedule 01.08.2012
comment
Благодаря... Просто бих искал да се уверя, че let a = ['\x09'], let a = '\x09' и let a = "\x09" всъщност са еднакви, нали? - person SoftTimur; 01.08.2012
comment
Освен това видях DBCS_whitespace = %\x3000, но \x3000 (както \x2028, \x2029) не съществува в OCaml, как мога да заобиколя това? - person SoftTimur; 01.08.2012

Ако трябва да представите не-ascii знаци във вашия лексер, тогава Ulex вероятно е това, от което се нуждаете. Документацията е на http://cduce.org/ulex/Ulexing.html, а началната страница на http://cduce.org/download.html

person Jonathan Protzenko    schedule 01.08.2012
comment
sedlex е наследник на проекта ulex. - person Flux; 27.04.2019