Строка "keyup"
помечена как токен NAME
: это проблема.
Вы должны понимать, что лексер работает независимо от анализатора. Если синтаксический анализатор пытается сопоставить токен KEYPRESS
, лексер не «слушает» его, а просто строит токен, следуя правилам:
Принимая во внимание эти правила и порядок ваших правил :
NAME : [A-Za-z_][A-Za-z_0-9]* ;
INT : [0-9]+ ;
KEY : [a-z] | [0-9] | 'shift' | 'ctrl' | 'alt' | 'meta' | 'space' | 'left' | 'right' | 'up' | 'down' | 'minus' | 'equals' | 'backspace' | 'openbracket' | 'closebracket' | 'backslash' | 'semicolon' | 'quote' | 'enter' | 'comma' | 'period' | 'slash' ;
KEYPRESS : 'keyup' | 'keydown' ;
маркер NAME
будет создан до большей части альтернатив KEY
, и все альтернативы KEYPRESS
будут созданы.
И поскольку INT
соответствует одной или нескольким цифрам и определен до KEY
, который также имеет альтернативу с одной цифрой, ясно, что лексер никогда не будет генерировать KEY
или KEYPRESS
токен.
Если вы переместите правило NAME
и INT
ниже правил KEY
и KEYPRESS
, то большинство токенов будут построены так, как вы ожидаете, это мое предположение.
Возможное решение будет выглядеть так:
KEY : [a-z] | 'shift' | 'ctrl' | 'alt' | 'meta' | 'space' | 'left' | 'right' | 'up' | 'down' | 'minus' | 'equals' | 'backspace' | 'openbracket' | 'closebracket' | 'backslash' | 'semicolon' | 'quote' | 'enter' | 'comma' | 'period' | 'slash' ;
KEYPRESS : 'keyup' | 'keydown' ;
NAME : [A-Za-z_][A-Za-z_0-9]* ;
SINGLE_DIGIT : [0-9] ;
INT : [0-9]+ ;
Т.е. Я удалил альтернативу [0-9]
из KEY
и ввел правило SINGLE_DIGIT
(которое помещено перед правилом INT
!).
Теперь создайте дополнительный парсер rules:
integer : INT | SINGLE_DIGIT ;
key : KEY | SINGLE_DIGIT ;
и изменить все вхождения INT
внутри правил синтаксического анализа на integer
(не вызывать ваше правило int
: это зарезервированное слово) и изменить все KEY
к key
.
И вы также можете сделать что-то похожее на NAME
и альтернативу [a-z]
в KEY
(т. е. один символ нижнего регистра теперь никогда не будет обозначаться как NAME
], всегда как KEY
).
Вы можете попробовать использовать Python с пандами и пиарроу:
import pandas as pd
df = pd.read_parquet('input.parquet')
df.to_csv('out.csv', index=False) # Exporting to CSV is easy
df.to_csv('out.txt', index=False, sep=' ') # Text is just a tad more difficult
df.to_csv('out.txt', index=False, sep='\t') # Alternatively, you can use tab separators
df.to_json('out.json') # Exporting to JSON is easy as well
См. Соответствующие документы по API:
Вы также можете изменить код выше, чтобы использовать fastparquet вместо pyarrow и проверить, дает ли это вам лучшую или худшую производительность. Все, что вам нужно изменить, - это строка, которая читает файл паркета:
df = pd.read_parquet('input.parquet', engine = 'fastparquet')
Не забудьте сначала установить pandas, pyarrow и fastparquet с помощью команды pip install pandas pyarrow fastparquet
(или аналогичной, в зависимости от вашего решения по управлению пакетами ). [1 110]