| # -*- coding: utf-8 -*- # |
| |
| module Rouge |
| module Lexers |
| class Praat < RegexLexer |
| title "Praat" |
| desc "The Praat scripting language (praat.org)" |
| |
| tag 'praat' |
| |
| filenames '*.praat', '*.proc', '*.psc' |
| |
| def self.analyze_text(text) |
| return 1 if text.shebang? 'praat' |
| end |
| |
| keywords = %w( |
| if then else elsif elif endif fi for from to endfor endproc while |
| endwhile repeat until select plus minus demo assert stopwatch |
| nocheck nowarn noprogress editor endeditor clearinfo |
| ) |
| |
| functions_string = %w( |
| backslashTrigraphsToUnicode chooseDirectory chooseReadFile |
| chooseWriteFile date demoKey do environment extractLine extractWord |
| fixed info left mid percent readFile replace replace_regex right |
| selected string unicodeToBackslashTrigraphs |
| ) |
| |
| functions_numeric = %w( |
| abs appendFile appendFileLine appendInfo appendInfoLine arccos arccosh |
| arcsin arcsinh arctan arctan2 arctanh barkToHertz beginPause |
| beginSendPraat besselI besselK beta beta2 binomialP binomialQ boolean |
| ceiling chiSquareP chiSquareQ choice comment cos cosh createDirectory |
| deleteFile demoClicked demoClickedIn demoCommandKeyPressed |
| demoExtraControlKeyPressed demoInput demoKeyPressed |
| demoOptionKeyPressed demoShiftKeyPressed demoShow demoWaitForInput |
| demoWindowTitle demoX demoY differenceLimensToPhon do editor endPause |
| endSendPraat endsWith erb erbToHertz erf erfc exitScript exp |
| extractNumber fileReadable fisherP fisherQ floor gaussP gaussQ |
| hertzToBark hertzToErb hertzToMel hertzToSemitones imax imin |
| incompleteBeta incompleteGammaP index index_regex integer invBinomialP |
| invBinomialQ invChiSquareQ invFisherQ invGaussQ invSigmoid invStudentQ |
| length ln lnBeta lnGamma log10 log2 max melToHertz min minusObject |
| natural number numberOfColumns numberOfRows numberOfSelected |
| objectsAreIdentical option optionMenu pauseScript |
| phonToDifferenceLimens plusObject positive randomBinomial randomGauss |
| randomInteger randomPoisson randomUniform real readFile removeObject |
| rindex rindex_regex round runScript runSystem runSystem_nocheck |
| selectObject selected semitonesToHertz sentence sentencetext sigmoid |
| sin sinc sincpi sinh soundPressureToPhon sqrt startsWith studentP |
| studentQ tan tanh text variableExists word writeFile writeFileLine |
| writeInfo writeInfoLine |
| ) |
| |
| functions_array = %w( |
| linear randomGauss randomInteger randomUniform zero |
| ) |
| |
| objects = %w( |
| Activation AffineTransform AmplitudeTier Art Artword Autosegment |
| BarkFilter BarkSpectrogram CCA Categories Cepstrogram Cepstrum |
| Cepstrumc ChebyshevSeries ClassificationTable Cochleagram Collection |
| ComplexSpectrogram Configuration Confusion ContingencyTable Corpus |
| Correlation Covariance CrossCorrelationTable CrossCorrelationTableList |
| CrossCorrelationTables DTW DataModeler Diagonalizer Discriminant |
| Dissimilarity Distance Distributions DurationTier EEG ERP ERPTier |
| EditCostsTable EditDistanceTable Eigen Excitation Excitations |
| ExperimentMFC FFNet FeatureWeights FileInMemory FilesInMemory Formant |
| FormantFilter FormantGrid FormantModeler FormantPoint FormantTier |
| GaussianMixture HMM HMM_Observation HMM_ObservationSequence HMM_State |
| HMM_StateSequence HMMObservation HMMObservationSequence HMMState |
| HMMStateSequence Harmonicity ISpline Index Intensity IntensityTier |
| IntervalTier KNN KlattGrid KlattTable LFCC LPC Label LegendreSeries |
| LinearRegression LogisticRegression LongSound Ltas MFCC MSpline ManPages |
| Manipulation Matrix MelFilter MelSpectrogram MixingMatrix Movie Network |
| OTGrammar OTHistory OTMulti PCA PairDistribution ParamCurve Pattern |
| Permutation Photo Pitch PitchModeler PitchTier PointProcess Polygon |
| Polynomial PowerCepstrogram PowerCepstrum Procrustes RealPoint RealTier |
| ResultsMFC Roots SPINET SSCP SVD Salience ScalarProduct Similarity |
| SimpleString SortedSetOfString Sound Speaker Spectrogram Spectrum |
| SpectrumTier SpeechSynthesizer SpellingChecker Strings StringsIndex |
| Table TableOfReal TextGrid TextInterval TextPoint TextTier Tier |
| Transition VocalTract VocalTractTier Weight WordList |
| ) |
| |
| variables_numeric = %w( |
| all average e left macintosh mono pi praatVersion right stereo |
| undefined unix windows |
| ) |
| |
| variables_string = %w( |
| praatVersion tab shellDirectory homeDirectory |
| preferencesDirectory newline temporaryDirectory |
| defaultDirectory |
| ) |
| |
| object_attributes = %w( |
| ncol nrow xmin ymin xmax ymax nx ny dx dy |
| ) |
| |
| state :root do |
| rule /(\s+)(#.*?$)/ do |
| groups Text, Comment::Single |
| end |
| |
| rule /^#.*?$/, Comment::Single |
| rule /;[^\n]*/, Comment::Single |
| rule /\s+/, Text |
| rule /\bprocedure\b/, Keyword, :procedure_definition |
| rule /\bcall\b/, Keyword, :procedure_call |
| rule /@/, Name::Function, :procedure_call |
| |
| mixin :function_call |
| |
| rule /\b(?:select all)\b/, Keyword |
| rule /\b(?:#{keywords.join('|')})\b/, Keyword |
| |
| rule /(\bform\b)(\s+)([^\n]+)/ do |
| groups Keyword, Text, Literal::String |
| push :old_form |
| end |
| |
| rule /(print(?:line|tab)?|echo|exit|asserterror|pause|send(?:praat|socket)|include|execute|system(?:_nocheck)?)(\s+)/ do |
| groups Keyword, Text |
| push :string_unquoted |
| end |
| |
| rule /(goto|label)(\s+)(\w+)/ do |
| groups Keyword, Text, Name::Label |
| end |
| |
| mixin :variable_name |
| mixin :number |
| |
| rule /"/, Literal::String, :string |
| |
| rule /\b(?:#{objects.join('|')})(?=\s+\S+\n)/, Name::Class, :string_unquoted |
| |
| rule /\b(?=[A-Z])/, Text, :command |
| rule /(\.{3}|[)(,\$])/, Punctuation |
| end |
| |
| state :command do |
| rule /( ?[\w()-]+ ?)/, Keyword |
| mixin :string_interpolated |
| |
| rule /\.{3}/ do |
| token Keyword |
| pop! |
| push :old_arguments |
| end |
| |
| rule /:/ do |
| token Keyword |
| pop! |
| push :comma_list |
| end |
| |
| rule /[\s\n]/, Text, :pop! |
| end |
| |
| state :procedure_call do |
| rule /\s+/, Text |
| |
| rule /([\w.]+)(:|\s*\()/ do |
| groups Name::Function, Punctuation |
| pop! |
| end |
| |
| rule /([\w.]+)/ do |
| token Name::Function |
| pop! |
| push :old_arguments |
| end |
| end |
| |
| state :procedure_definition do |
| rule /\s/, Text |
| |
| rule /([\w.]+)(\s*?[(:])/ do |
| groups Name::Function, Text |
| pop! |
| end |
| |
| rule /([\w.]+)([^\n]*)/ do |
| groups Name::Function, Text |
| pop! |
| end |
| end |
| |
| state :function_call do |
| rule /\b(#{functions_string.join('|')})\$(?=\s*[:(])/, Name::Function, :function |
| rule /\b(#{functions_array.join('|')})#(?=\s*[:(])/, Name::Function, :function |
| rule /\b(#{functions_numeric.join('|')})(?=\s*[:(])/, Name::Function, :function |
| end |
| |
| state :function do |
| rule /\s+/, Text |
| |
| rule /(?::|\s*\()/ do |
| token Text |
| pop! |
| push :comma_list |
| end |
| end |
| |
| state :comma_list do |
| rule /(\s*\n\s*)(\.{3})/ do |
| groups Text, Punctuation |
| end |
| |
| rule /\s*[\])\n]/, Text, :pop! |
| |
| rule /\s+/, Text |
| rule /"/, Literal::String, :string |
| rule /\b(if|then|else|fi|endif)\b/, Keyword |
| |
| mixin :function_call |
| mixin :variable_name |
| mixin :operator |
| mixin :number |
| |
| rule /[()]/, Text |
| rule /,/, Punctuation |
| end |
| |
| state :old_arguments do |
| rule /\n/, Text, :pop! |
| |
| mixin :variable_name |
| mixin :operator |
| mixin :number |
| |
| rule /"/, Literal::String, :string |
| rule /[^\n]/, Text |
| end |
| |
| state :number do |
| rule /\n/, Text, :pop! |
| rule /\b\d+(\.\d*)?([eE][-+]?\d+)?%?/, Literal::Number |
| end |
| |
| state :variable_name do |
| mixin :operator |
| mixin :number |
| |
| rule /\b(?:#{variables_string.join('|')})\$/, Name::Builtin |
| rule /\b(?:#{variables_numeric.join('|')})(?!\$)\b/, Name::Builtin |
| |
| rule /\b(Object|#{objects.join('|')})_/ do |
| token Name::Builtin |
| push :object_reference |
| end |
| |
| rule /\.?[a-z][a-zA-Z0-9_.]*(\$|#)?/, Text |
| rule /[\[\]]/, Text, :comma_list |
| mixin :string_interpolated |
| end |
| |
| state :object_reference do |
| mixin :string_interpolated |
| rule /([a-z][a-zA-Z0-9_]*|\d+)/, Name::Builtin |
| |
| rule /\.(#{object_attributes.join('|')})\b/, Name::Builtin, :pop! |
| |
| rule /\$/, Name::Builtin |
| rule /\[/, Text, :pop! |
| end |
| |
| state :operator do |
| # This rule incorrectly matches === or +++++, which are not operators |
| rule /([+\/*<>=!-]=?|[&*|][&*|]?|\^|<>)/, Operator |
| rule /(?<![\w.])(and|or|not|div|mod)(?![\w.])/, Operator::Word |
| end |
| |
| state :string_interpolated do |
| rule /'[\._a-z][^\[\]'":]*(\[([\d,]+|"[\w\d,]+")\])?(:[0-9]+)?'/, Literal::String::Interpol |
| end |
| |
| state :string_unquoted do |
| rule /\n\s*\.{3}/, Punctuation |
| rule /\n/, Text, :pop! |
| rule /\s/, Text |
| |
| mixin :string_interpolated |
| |
| rule /'/, Literal::String |
| rule /[^'\n]+/, Literal::String |
| end |
| |
| state :string do |
| rule /\n\s*\.{3}/, Punctuation |
| rule /"/, Literal::String, :pop! |
| |
| mixin :string_interpolated |
| |
| rule /'/, Literal::String |
| rule /[^'"\n]+/, Literal::String |
| end |
| |
| state :old_form do |
| rule /(\s+)(#.*?$)/ do |
| groups Text, Comment::Single |
| end |
| |
| rule /\s+/, Text |
| |
| rule /(optionmenu|choice)([ \t]+\S+:[ \t]+)/ do |
| groups Keyword, Text |
| push :number |
| end |
| |
| rule /(option|button)([ \t]+)/ do |
| groups Keyword, Text |
| push :string_unquoted |
| end |
| |
| rule /(sentence|text)([ \t]+\S+)/ do |
| groups Keyword, Text |
| push :string_unquoted |
| end |
| |
| rule /(word)([ \t]+\S+[ \t]*)(\S+)?([ \t]+.*)?/ do |
| groups Keyword, Text, Literal::String, Text |
| end |
| |
| rule /(boolean)(\s+\S+\s*)(0|1|"?(?:yes|no)"?)/ do |
| groups Keyword, Text, Name::Variable |
| end |
| |
| rule /(real|natural|positive|integer)([ \t]+\S+[ \t]*)([+-]?)/ do |
| groups Keyword, Text, Operator |
| push :number |
| end |
| |
| rule /(comment)(\s+)/ do |
| groups Keyword, Text |
| push :string_unquoted |
| end |
| |
| rule /\bendform\b/, Keyword, :pop! |
| end |
| |
| end |
| end |
| end |