كيف يمكنني تحليل قائمة الاسم = أزواج القيمة في مولد المحللين (Antlr، yacc، إلخ)؟

StackOverflow https://stackoverflow.com/questions/897934

سؤال

أريد تحليل قائمة أزواج (Whitespace منفصلة) في شكل

name1=value1 name2=value2 ...

أين:

  • يمكن أن يحتوي الاسم على أي شيء باستثناء المسافة البيضاء وعلامة متساوية
  • يمكن أن تحتوي القيمة على أي شيء باستثناء المسافة البيضاء (بما في ذلك علامات متساوية!)

المشكلة هي الحصول على المحلل لمطابقة الإدخال مثل

name1=value1

كما منفصل 'NAME EQUALS VALUE' الرموز، وليس كواحد 'VALUE' رمزية.

ملاحظة. أعلم أن هذا تافهة كود مباشرة، لكنني بحاجة إلى هذا في سياق محلل أكبر.

هل كانت مفيدة؟

المحلول

هنا شيء في Antlr، الذي يوضح هذا؛

a=b=c=d c=d e=f

قد لا يكون هذا كل ما تحتاجه، لكن يجب أن يكون جوهره.

grammar NameValuePairs;

pairs   :  namevaluepair (WS namevaluepair)*;

namevaluepair
  :  name '=' value;

name  :  ID;

value  :  ID ('=' ID)*;

WS  :  ' ' {skip()};

EQ  :  '=';

ID  :  ~(' ' | '=')*;

نصائح أخرى

أعتقد أنك قد ينتهي بك الأمر بمسألة إذا كانت القيمة يمكن أن تحتوي على علامة متساوية. أعتقد أنه سيكون من الأفضل، إن أمكن، لجعل علامة متساوية على حرف محجوز، أو قم بالتبديل إلى حرف محجوز مختلف يعني "=".

لست متأكدا مما إذا كان هذا سيعمل في سياق محللك الأكبر، ولكن يمكنك تقسيم المساحة، مما يتيح لك مجموعة (أو أي بنية البيانات التي ستستخدمها لغتك) من أزواج "الاسم = القيمة". ثم حلقة من خلال الصفيف والانقسام مرة أخرى على الحرف المحجوز الذي تستخدمه ل "=". إذا لم تتمكن من تغيير أو حجز "="، فيمكنك Regex لمطابقة المثال الأول من '='. آمل أنني لست خارج قاعدة!

أنت لا تحتاج إلى محلل قوي لأزواج قيمة الاسم، Regex سيكون كافيا. ما لم يكن لديك بعض الهيكل السياقي أو المتداخل، فإن هذه "الوظيفة" تنتمي إلى Lexer، وليس المحلل :)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top